/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact f6f21604c1367354b28d03c983a83279071a2948:


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 37 20 32 30 30 39 2f 30 37 2f 31 36 20  .447 2009/07/16 
0220: 31 32 3a 34 31 3a 30 36 20 64 72 68 20 45 78 70  12:41:06 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0250: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 27  .** Return the '
0260: 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68 65  affinity' of the
0270: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0280: 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20  r if any..**.** 
0290: 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  If pExpr is a co
02a0: 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e 63  lumn, a referenc
02b0: 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69  e to a column vi
02c0: 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73 2c  a an 'AS' alias,
02d0: 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65 6c  .** or a sub-sel
02e0: 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75 6d  ect with a colum
02f0: 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  n as the return 
0300: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
0310: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66 20  .** affinity of 
0320: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72  that column is r
0330: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
0340: 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74 75  se, 0x00 is retu
0350: 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  rned,.** indicat
0360: 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  ing no affinity 
0370: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0380: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74  on..**.** i.e. t
0390: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
03a0: 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e 20  expresssions in 
03b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
03c0: 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20  atements all.** 
03d0: 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74 79  have an affinity
03e0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53  ABLE t1(a);.** S
0400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0410: 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45  WHERE a;.** SELE
0420: 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20 74  CT a AS b FROM t
0430: 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45  1 WHERE b;.** SE
0440: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0450: 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20 66  HERE (select a f
0460: 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72  rom t1);.*/.char
0470: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0480: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0490: 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 70 45  ){.  int op = pE
04a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
04b0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
04c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
04d0: 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49 73 53  r->flags&EP_xIsS
04e0: 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72 65 74  elect );.    ret
04f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
0500: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78  ffinity(pExpr->x
0510: 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  .pSelect->pEList
0520: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0530: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0540: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0550: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
0570: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
0580: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
0590: 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
05a0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
05b0: 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
05c0: 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ken);.  }.#endif
05d0: 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41  .  if( (op==TK_A
05e0: 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d  GG_COLUMN || op=
05f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70  =TK_COLUMN || op
0600: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 0a  ==TK_REGISTER) .
0610: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61     && pExpr->pTa
0620: 62 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  b!=0.  ){.    /*
0630: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
0640: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 21   && pExpr->pTab!
0650: 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  =0 happens when 
0660: 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e  pExpr was origin
0670: 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 61 20 54 4b  ally.    ** a TK
0680: 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73 20  _COLUMN but was 
0690: 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c 75  previously evalu
06a0: 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64 20  ated and cached 
06b0: 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a 2f  in a register */
06c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 45 78  .    int j = pEx
06d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
06e0: 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
06f0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  n SQLITE_AFF_INT
0700: 45 47 45 52 3b 0a 20 20 20 20 61 73 73 65 72 74  EGER;.    assert
0710: 28 20 70 45 78 70 72 2d 3e 70 54 61 62 20 26 26  ( pExpr->pTab &&
0720: 20 6a 3c 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   j<pExpr->pTab->
0730: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 72 65 74 75  nCol );.    retu
0740: 72 6e 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e  rn pExpr->pTab->
0750: 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79  aCol[j].affinity
0760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0770: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a  Expr->affinity;.
0780: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
0790: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07a0: 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73 73 69  nce for expressi
07b0: 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65 20 74  on pExpr to be t
07c0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
07d0: 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 62  sequence named b
07e0: 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75  y pToken.   Retu
07f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0800: 74 68 65 20 72 65 76 69 73 65 64 20 65 78 70 72  the revised expr
0810: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63  ession..** The c
0820: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0830: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 22  e is marked as "
0840: 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e 67 20  explicit" using 
0850: 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  the EP_ExpCollat
0860: 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65  e.** flag.  An e
0870: 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e  xplicit collatin
0880: 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  g sequence will 
0890: 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69 63 69  override implici
08a0: 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t.** collating s
08b0: 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70  equences..*/.Exp
08c0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53 65  r *sqlite3ExprSe
08d0: 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tColl(Parse *pPa
08e0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
08f0: 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c 4e 61  , Token *pCollNa
0900: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  me){.  char *zCo
0910: 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
0920: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
0930: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
0940: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 43   sequence */.  C
0950: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
0960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0970: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f  Parse->db;.  zCo
0980: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
0990: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43  FromToken(db, pC
09a0: 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ollName);.  if( 
09b0: 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20 29  pExpr && zColl )
09c0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
09d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
09e0: 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
09f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
0a00: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
0a10: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
0a20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
0a30: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
0a40: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
0a50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0a60: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  b, zColl);.  ret
0a70: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0a80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0a90: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
0aa0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
0ab0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
0ac0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
0ad0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
0ae0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
0af0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0b00: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0b10: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0b20: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0b30: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0b40: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72  Coll = 0;.  Expr
0b50: 20 2a 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 77   *p = pExpr;.  w
0b60: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
0b70: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  ){.    int op;. 
0b80: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43     pColl = p->pC
0b90: 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  oll;.    if( pCo
0ba0: 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
0bb0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
0bc0: 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f  if( (op==TK_AGG_
0bd0: 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  COLUMN || op==TK
0be0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
0bf0: 4b 5f 52 45 47 49 53 54 45 52 29 20 26 26 20 70  K_REGISTER) && p
0c00: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
0c10: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0c20: 49 53 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62  ISTER && p->pTab
0c30: 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e  !=0 happens when
0c40: 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67 69   pExpr was origi
0c50: 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61  nally.      ** a
0c60: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77   TK_COLUMN but w
0c70: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76  as previously ev
0c80: 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68  aluated and cach
0c90: 65 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  ed in a register
0ca0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
0cb0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
0cc0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43     int j = p->iC
0cd0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
0ce0: 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j>=0 ){.       
0cf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0d00: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
0d10: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54     zColl = p->pT
0d20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
0d30: 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  l;.        pColl
0d40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
0d50: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
0d60: 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
0d70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
0d80: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
0d90: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
0da0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
0db0: 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20 6f 70  p!=TK_CAST && op
0dc0: 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a 20 20  !=TK_UPLUS ){.  
0dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
0de0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66  .    p = p->pLef
0df0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  t;.  }.  if( sql
0e00: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0e10: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0e20: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0e30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0e40: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0e50: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0e60: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0e70: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0e80: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0e90: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ea0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0eb0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ec0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ed0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0ee0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0ef0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0f00: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0f10: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0f20: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0f30: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0f40: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0f50: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0f60: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0f70: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0f80: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0f90: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0fa0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0fb0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0fc0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0fd0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0fe0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0ff0: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
1000: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
1010: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
1020: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
1030: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1040: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
1050: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1060: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
1070: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
1080: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1090: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
10a0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
10b0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
10c0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
10d0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
10e0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
10f0: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
1100: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
1110: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
1120: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1130: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
1140: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
1150: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
1160: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
1170: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
1180: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
1190: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
11a0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
11b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
11c0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
11d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
11e0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
11f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
1200: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
1210: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
1220: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
1230: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
1240: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
1250: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
1260: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
1270: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1280: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
1290: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
12a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
12b0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
12c0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
12d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
12e0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
12f0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
1300: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
1310: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1320: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
1330: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
1340: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1350: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
1360: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
1370: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
1380: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
1390: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
13a0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
13b0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13c0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
13d0: 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69   aff);.  }else i
13e0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
13f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1400: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 61  Select) ){.    a
1410: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1420: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1430: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45  r->x.pSelect->pE
1440: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1450: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1460: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
1470: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
1480: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
1490: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
14a0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
14b0: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
14c0: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
14d0: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
14e0: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
14f0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
1500: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
1510: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
1520: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
1530: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
1540: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
1550: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
1560: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
1570: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
1580: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1590: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
15a0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
15b0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
15c0: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
15d0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
15e0: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
15f0: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
1600: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
1610: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
1620: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
1630: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
1640: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
1650: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
1660: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
1670: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
1680: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
1690: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
16a0: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
16b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16c0: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
16d0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
16e0: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
16f0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1700: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1710: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1720: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1730: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
1740: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
1750: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
1760: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
1770: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1780: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
1790: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
17a0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
17b0: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
17c0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
17d0: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
17e0: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
17f0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
1800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1820: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1830: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
1840: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
1850: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1860: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
1870: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
1880: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
1890: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
18a0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
18b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
18c0: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
18d0: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
18e0: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
18f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
1900: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
1910: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
1920: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
1930: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
1940: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
1950: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1960: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
1970: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
1980: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
1990: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
19a0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
19b0: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
19c0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
19d0: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
19e0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
19f0: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
1a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
1a10: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
1a20: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
1a30: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
1a50: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1a60: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1a70: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1a80: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1a90: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1aa0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1ac0: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66  ght && pRight->f
1ad0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1ae0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  late ){.    asse
1af0: 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  rt( pRight->pCol
1b00: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
1b10: 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a   pRight->pColl;.
1b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
1b30: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1b40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b50: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
1b60: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1b70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1b80: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1b90: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
1ba0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1bb0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1bc0: 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70 65 72  enerate the oper
1bd0: 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61  ands for a compa
1be0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
1bf0: 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65    Before.** gene
1c00: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
1c10: 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64  for each operand
1c20: 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79  , set the EP_Any
1c30: 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74  Aff.** flag on t
1c40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1c50: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1c60: 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a   able to used a.
1c70: 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e  ** cached column
1c80: 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1c90: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72  previously under
1ca0: 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e  gone an.** affin
1cb0: 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73  ity change..*/.s
1cc0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43  tatic void codeC
1cd0: 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a  ompareOperands(.
1ce0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1cf0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1d00: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1d10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d20: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1d30: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1d40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  erand */.  int *
1d50: 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20  pRegLeft,    /* 
1d60: 52 65 67 69 73 74 65 72 20 77 68 65 72 65 20 6c  Register where l
1d70: 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73  eft operand is s
1d80: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  tored */.  int *
1d90: 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20  pFreeLeft,   /* 
1da0: 46 72 65 65 20 74 68 69 73 20 72 65 67 69 73 74  Free this regist
1db0: 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a  er when done */.
1dc0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1dd0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1de0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1df0: 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20  t *pRegRight,   
1e00: 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72  /* Register wher
1e10: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1e20: 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  is stored */.  i
1e30: 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74 20 20  nt *pFreeRight  
1e40: 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72   /* Write temp r
1e50: 65 67 69 73 74 65 72 20 66 6f 72 20 72 69 67 68  egister for righ
1e60: 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20  t operand there 
1e70: 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  */.){.  while( p
1e80: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  Left->op==TK_UPL
1e90: 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65  US ) pLeft = pLe
1ea0: 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65  ft->pLeft;.  pLe
1eb0: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
1ec0: 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c  AnyAff;.  *pRegL
1ed0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1ee0: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef0: 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65  , pLeft, pFreeLe
1f00: 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ft);.  while( pR
1f10: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  ight->op==TK_UPL
1f20: 55 53 20 29 20 70 52 69 67 68 74 20 3d 20 70 52  US ) pRight = pR
1f30: 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  ight->pLeft;.  p
1f40: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  Right->flags |= 
1f50: 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52  EP_AnyAff;.  *pR
1f60: 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  egRight = sqlite
1f70: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f80: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46  arse, pRight, pF
1f90: 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  reeRight);.}../*
1fa0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1fb0: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
1fc0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1fd0: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
1fe0: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
1ff0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2000: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
2010: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
2020: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
2030: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
2040: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
2050: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
2060: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2070: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2080: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2090: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
20a0: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
20b0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
20c0: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
20d0: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
20e0: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
20f0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2100: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
2110: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
2120: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
2130: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
2140: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
2150: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
2160: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2170: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2180: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2190: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
21a0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
21b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
21c0: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
21d0: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
21e0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
21f0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2200: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
2210: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
2220: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
2250: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
2260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2270: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2280: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2290: 0a 20 20 69 66 28 20 28 70 35 20 26 20 53 51 4c  .  if( (p5 & SQL
22a0: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21 3d 53  ITE_AFF_MASK)!=S
22b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
22c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22d0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
22e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31  ange(pParse, in1
22f0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
2300: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2310: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2320: 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20   in2, 1);.  }.  
2330: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
2350: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
2360: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
2370: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
2380: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2390: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
23a0: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
23b0: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
23c0: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
23d0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
23e0: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
23f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2400: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2420: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
2430: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2440: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
2450: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
2460: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2470: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
2480: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
2490: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
24a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24b0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
24c0: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
24d0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
24e0: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
24f0: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
2500: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2510: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2520: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2540: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
2550: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
2560: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2570: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
2580: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
2590: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
25a0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
25b0: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
25c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
25d0: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
25e0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
25f0: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
2600: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
2610: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
2620: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
2630: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
2640: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
2650: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
2660: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
2670: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
2680: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
2690: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
26a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26b0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
26c0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
26d0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
26e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
26f0: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
2700: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
2710: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
2720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2730: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
2740: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
2750: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2760: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2770: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2780: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2790: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
27a0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
27b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
27c0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
27d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
27e0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
27f0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
2800: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2810: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
2820: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
2830: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2840: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2850: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
2860: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2870: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
2880: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2890: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
28a0: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
28b0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
28c0: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
28d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
28e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
28f0: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
2900: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2910: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
2920: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
2930: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2940: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
2950: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
2960: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2970: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2980: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2990: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
29a0: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
29b0: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
29c0: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
29d0: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
29e0: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
29f0: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
2a00: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
2a10: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
2a20: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
2a30: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
2a40: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
2a50: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
2a60: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2a70: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2a80: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2a90: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2aa0: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2ab0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2ac0: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2ad0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2ae0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
2af0: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
2b00: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2b10: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
2b20: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69  lect) ){.    hei
2b30: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78  ghtOfSelect(p->x
2b40: 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  .pSelect, &nHeig
2b50: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
2b60: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
2b70: 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26  st(p->x.pList, &
2b80: 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  nHeight);.  }.  
2b90: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
2ba0: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
2bb0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
2bc0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
2bd0: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
2be0: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
2bf0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
2c00: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
2c10: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
2c20: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
2c30: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
2c40: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
2c50: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
2c60: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2c70: 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61  eight(Parse *pPa
2c80: 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  rse, Expr *p){. 
2c90: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
2ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2cb0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
2cc0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
2cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2ce0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2cf0: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
2d00: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
2d10: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
2d20: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
2d30: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
2d40: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2d50: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2d60: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
2d70: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2d80: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2d90: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
2da0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
2db0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a 20  eight;.}.#else. 
2dc0: 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74   #define exprSet
2dd0: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
2de0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
2df0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
2e00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e10: 6e 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61  ne is the core a
2e20: 6c 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70  llocator for Exp
2e30: 72 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43  r nodes..**.** C
2e40: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
2e50: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
2e60: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
2e70: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
2e80: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
2e90: 6f 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ode and for the 
2ea0: 70 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  pToken argument 
2eb0: 69 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f  is a single allo
2ec0: 63 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e  cation.** obtain
2ed0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
2ee0: 62 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  bMalloc().  The 
2ef0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2f00: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2f10: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2f20: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
2f30: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
2f40: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75  d..**.** If dequ
2f50: 6f 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ote is true, the
2f60: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20  n the token (if 
2f70: 69 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65  it exists) is de
2f80: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65  quoted..** If de
2f90: 71 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20  quote is false, 
2fa0: 6e 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20  no dequoting is 
2fb0: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68  performance.  Th
2fc0: 65 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72  e deQuote.** par
2fd0: 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65  ameter is ignore
2fe0: 64 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  d if pToken is N
2ff0: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f  ULL or if the to
3000: 6b 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ken does not.** 
3010: 61 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f  appear to be quo
3020: 74 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f  ted.  If the quo
3030: 74 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20  tes were of the 
3040: 66 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62  form "..." (doub
3050: 6c 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68  le-quotes).** th
3060: 65 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f  en the EP_DblQuo
3070: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
3080: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
3090: 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  n node..**.** Sp
30a0: 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
30b0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61  op==TK_INTEGER a
30c0: 6e 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73  nd pToken points
30d0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
30e0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e  t.** can be tran
30f0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32  slated into a 32
3100: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68  -bit integer, th
3110: 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20  en the token is 
3120: 6e 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  not.** stored in
3130: 20 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74   u.zToken.  Inst
3140: 65 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72  ead, the integer
3150: 20 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74   values is writt
3160: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61  en.** into u.iVa
3170: 6c 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49  lue and the EP_I
3180: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20  ntValue flag is 
3190: 73 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73  set.  No extra s
31a0: 74 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c  torage.** is all
31b0: 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
31c0: 68 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20  he integer text 
31d0: 61 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20  and the dequote 
31e0: 66 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  flag is ignored.
31f0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3200: 33 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71  3ExprAlloc(.  sq
3210: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3220: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
3230: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
3240: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
3250: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
3260: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3270: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3280: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
3290: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
32a0: 65 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  en,    /* Token 
32b0: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
32c0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
32d0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
32e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
32f0: 20 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20   dequote */.){. 
3300: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
3310: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
3320: 20 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b   int iValue = 0;
3330: 0a 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ..  if( pToken )
3340: 7b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b  {.    if( op!=TK
3350: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b  _INTEGER || pTok
3360: 65 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  en->z==0.       
3370: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
3380: 49 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c  Int32(pToken->z,
3390: 20 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a   &iValue)==0 ){.
33a0: 20 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70        nExtra = p
33b0: 54 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20  Token->n+1;.    
33c0: 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73  }.  }.  pNew = s
33d0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
33e0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
33f0: 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20 20 69  pr)+nExtra);.  i
3400: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
3410: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
3420: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 67  ;.    pNew->iAgg
3430: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70   = -1;.    if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  Token ){.      i
3450: 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29 7b 0a  f( nExtra==0 ){.
3460: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
3470: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
3480: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
3490: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 56 61  ->u.iValue = iVa
34a0: 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lue;.      }else
34b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  {.        int c;
34c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
34d0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
34e0: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20  )&pNew[1];.     
34f0: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
3500: 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b 65 6e  u.zToken, pToken
3510: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29 3b  ->z, pToken->n);
3520: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
3530: 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e 2d 3e  .zToken[pToken->
3540: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
3550: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 6e  if( dequote && n
3560: 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20 20 20  Extra>=3 .      
3570: 20 20 20 20 20 20 20 26 26 20 28 28 63 20 3d 20         && ((c = 
3580: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d 3d 27  pToken->z[0])=='
3590: 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20 7c 7c  \'' || c=='"' ||
35a0: 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 60   c=='[' || c=='`
35b0: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
35c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70  sqlite3Dequote(p
35d0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  New->u.zToken);.
35e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
35f0: 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61  ='"' ) pNew->fla
3600: 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74  gs |= EP_DblQuot
3610: 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
3620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20      }.    }.#if 
3630: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3640: 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e 65 77  DEPTH>0.    pNew
3650: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
3660: 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20 72 65  endif  .  }.  re
3670: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3680: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
3690: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
36a0: 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 74  de from a zero-t
36b0: 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65 6e 20  erminated token 
36c0: 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c 72 65  that has.** alre
36d0: 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f 74 65  ady been dequote
36e0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
36f0: 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c 69 74  te3Expr(.  sqlit
3700: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3710: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
3720: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3730: 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e  Zero() (may be n
3740: 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ull) */.  int op
3750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3760: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
3770: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  opcode */.  cons
3780: 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 20  t char *zToken  
3790: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67      /* Token arg
37a0: 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  ument.  Might be
37b0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 6f   NULL */.){.  To
37c0: 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d 20 7a  ken x;.  x.z = z
37d0: 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d 20 7a  Token;.  x.n = z
37e0: 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65 33 53  Token ? sqlite3S
37f0: 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e 29 20  trlen30(zToken) 
3800: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
3810: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
3820: 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b 0a 7d  b, op, &x, 0);.}
3830: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 73  ../*.** Attach s
3840: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3850: 64 20 70 52 69 67 68 74 20 74 6f 20 74 68 65 20  d pRight to the 
3860: 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f 74 2e  Expr node pRoot.
3870: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f 74 3d  .**.** If pRoot=
3880: 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
3890: 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79 20 61   that a memory a
38a0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
38b0: 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  has occurred..**
38c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
38d0: 65 6c 65 74 65 20 74 68 65 20 73 75 62 74 72 65  elete the subtre
38e0: 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  es pLeft and pRi
38f0: 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ght..*/.void sql
3900: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
3910: 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69 74 65  btrees(.  sqlite
3920: 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20 2a 70  3 *db,.  Expr *p
3930: 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a 70 4c  Root,.  Expr *pL
3940: 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70 52 69  eft,.  Expr *pRi
3950: 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70 52 6f  ght.){.  if( pRo
3960: 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ot==0 ){.    ass
3970: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
3980: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c  ailed );.    sql
3990: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
39a0: 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  b, pLeft);.    s
39b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
39c0: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
39d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
39e0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
39f0: 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d 20 70  Root->pRight = p
3a00: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
3a10: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
3a20: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3a30: 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  {.        pRoot-
3a40: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
3a50: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
3a60: 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20 3d 20   pRoot->pColl = 
3a70: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
3a80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3a90: 20 69 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20   if( pLeft ){.  
3aa0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74      pRoot->pLeft
3ab0: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20   = pLeft;.      
3ac0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
3ad0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   ){.        pRoo
3af0: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  t->flags |= EP_E
3b00: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20  xpCollate;.     
3b10: 20 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 6c 6c 20     pRoot->pColl 
3b20: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
3b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3b40: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
3b50: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
3b60: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
3b70: 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20  Expr node which 
3b80: 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73  joins as many as
3b90: 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a   two subtrees..*
3ba0: 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68  *.** One or both
3bb0: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73   of the subtrees
3bc0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52   can be NULL.  R
3bd0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3be0: 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78  to the new.** Ex
3bf0: 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66  pr node.  Or, if
3c00: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
3c10: 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65  curs, set pParse
3c20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3c30: 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20  ed,.** free the 
3c40: 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74  subtrees and ret
3c50: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70  urn NULL..*/.Exp
3c60: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
3c70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3c80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
3c90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ca0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
3cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
3cc0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
3cd0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3cf0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
3d00: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
3d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
3d20: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
3d30: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
3d40: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
3d50: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
3d60: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
3d70: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
3d80: 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54 6f  rse->db, op, pTo
3d90: 6b 65 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ken, 1);.  sqlit
3da0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
3db0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
3dc0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
3dd0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  t);.  return p;.
3de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
3df0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
3e00: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
3e10: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
3e20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
3e30: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
3e40: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
3e50: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
3e60: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3e70: 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  prAnd(sqlite3 *d
3e80: 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  b, Expr *pLeft, 
3e90: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
3ea0: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
3eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
3ec0: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
3ed0: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
3ee0: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
3ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
3f00: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
3f10: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
3f20: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
3f30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
3f40: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
3f50: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
3f60: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
3f70: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
3f80: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
3f90: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3fa0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
3fb0: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
3fc0: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
3fd0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3fe0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
3ff0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
4000: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
4010: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
4020: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4030: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4040: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4050: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4060: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4070: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4080: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4090: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
40a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
40b0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
40c0: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
40d0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
40e0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
40f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4100: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
4110: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
4120: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4130: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4140: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4150: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4160: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
4170: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4180: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4190: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
41a0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
41b0: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
41c0: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
41d0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
41e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
41f0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4200: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4210: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4220: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4230: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4240: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4250: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4260: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4270: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4280: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4290: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
42a0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
42b0: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
42c0: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
42d0: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
42e0: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
42f0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4300: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4310: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4320: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4330: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4340: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4350: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4360: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4370: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4380: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4390: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
43a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
43b0: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
43c0: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
43d0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
43e0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
43f0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
4400: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4410: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
4420: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4430: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4440: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  r){.  sqlite3 *d
4450: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4460: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
4470: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4480: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
4490: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
44a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
44b0: 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52  EP_IntValue|EP_R
44c0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
44d0: 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45  nly) );.  z = pE
44e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
44f0: 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
4500: 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21  .  assert( z[0]!
4510: 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d  =0 );.  if( z[1]
4520: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==0 ){.    /* Wi
4530: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4540: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4550: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4560: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4570: 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f  assert( z[0]=='?
4580: 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ' );.    pExpr->
4590: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
45a0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65  e->nVar;.  }else
45b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29   if( z[0]=='?' )
45c0: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
45d0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
45e0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
45f0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
4600: 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73  er and.    ** us
4610: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
4620: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
4630: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45     int i;.    pE
4640: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20  xpr->iTable = i 
4650: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 7a  = atoi((char*)&z
4660: 5b 31 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61  [1]);.    testca
4670: 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  se( i==0 );.    
4680: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
4690: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
46a0: 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  i==db->aLimit[SQ
46b0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
46c0: 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20 29 3b  BLE_NUMBER]-1 );
46d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69  .    testcase( i
46e0: 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ==db->aLimit[SQL
46f0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
4700: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b 0a 20 20  LE_NUMBER] );.  
4710: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 64    if( i<1 || i>d
4720: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4730: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4740: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
4750: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4760: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
4770: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
4780: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
4790: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
47a0: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
47b0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
47c0: 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20 20 20 20  E_NUMBER]);.    
47d0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  }.    if( i>pPar
47e0: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
47f0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
4800: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   i;.    }.  }els
4810: 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  e{.    /* Wildca
4820: 72 64 73 20 6c 69 6b 65 20 22 3a 61 61 61 22 2c  rds like ":aaa",
4830: 20 22 24 61 61 61 22 20 6f 72 20 22 40 61 61 61   "$aaa" or "@aaa
4840: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
4850: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
4860: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
4870: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
4880: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
4890: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
48a0: 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  me.    ** has ne
48b0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
48c0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
48d0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
48e0: 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ber.    */.    i
48f0: 6e 74 20 69 3b 0a 20 20 20 20 75 33 32 20 6e 3b  nt i;.    u32 n;
4900: 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
4910: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
4920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
4930: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
4940: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
4950: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
4960: 61 72 45 78 70 72 5b 69 5d 3b 0a 20 20 20 20 20  arExpr[i];.     
4970: 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
4980: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ;.      if( memc
4990: 6d 70 28 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pE->u.zToken,
49a0: 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 70 45 2d   z, n)==0 && pE-
49b0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 6e 5d 3d 3d 30 20  >u.zToken[n]==0 
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
49d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
49e0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
49f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4a00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
4a10: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
4a20: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4a30: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
4a40: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
4a50: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4a60: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4a70: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
4a80: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
4a90: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
4aa0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
4ab0: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
4ac0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4ad0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
4ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
4af0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
4b00: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4b20: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4b40: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4b50: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4b60: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
4b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4b90: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
4ba0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
4bb0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
4bc0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
4bd0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
4be0: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
4bf0: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
4c00: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
4c10: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4c20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4c30: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4c40: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4c50: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4c60: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4c70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4c80: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
4c90: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
4ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
4cb0: 61 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ar an expression
4cc0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 6f   structure witho
4cd0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
4ce0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4cf0: 2e 0a 2a 2a 20 53 75 62 73 74 72 75 63 74 75 72  ..** Substructur
4d00: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
4d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4d20: 72 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a  rClear(sqlite3 *
4d30: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4d40: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4d50: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e    if( !ExprHasAn
4d60: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
4d70: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
4d80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4d90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
4da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4db0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
4dc0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
4dd0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4de0: 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29  y(p, EP_Reduced)
4df0: 20 26 26 20 28 70 2d 3e 66 6c 61 67 73 32 20 26   && (p->flags2 &
4e00: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
4e10: 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  en)!=0 ){.      
4e20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4e30: 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  , p->u.zToken);.
4e40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 45 78      }.    if( Ex
4e50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4e60: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
4e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4e80: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
4e90: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
4ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4eb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4ec0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70  elete(db, p->x.p
4ed0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
4ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
4ef0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
4f00: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
4f10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f20: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
4f30: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
4f40: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
4f50: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4f60: 45 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70 29  ExprClear(db, p)
4f70: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
4f80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
4f90: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
4fa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fb0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
4fc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4fd0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
4fe0: 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65 78  cated for the ex
4ff0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
5000: 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  re .** passed as
5010: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5020: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ent. This is alw
5030: 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f  ays one of EXPR_
5040: 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50  FULLSIZE,.** EXP
5050: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
5060: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5070: 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  IZE..*/.static i
5080: 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69 7a  nt exprStructSiz
5090: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
50a0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
50b0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
50c0: 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  y) ) return EXPR
50d0: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a  _TOKENONLYSIZE;.
50e0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
50f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75  perty(p, EP_Redu
5100: 63 65 64 29 20 29 20 72 65 74 75 72 6e 20 45 58  ced) ) return EX
5110: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a  PR_REDUCEDSIZE;.
5120: 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55    return EXPR_FU
5130: 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSIZE;.}../*.**
5140: 20 54 68 65 20 64 75 70 65 64 45 78 70 72 2a 53   The dupedExpr*S
5150: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65  ize() routines e
5160: 61 63 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ach return the n
5170: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
5180: 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74  equired.** to st
5190: 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ore a copy of an
51a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65   expression or e
51b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
51c0: 20 54 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a   They differ in.
51d0: 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ** how much of t
51e0: 68 65 20 74 72 65 65 20 69 73 20 6d 65 61 73 75  he tree is measu
51f0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64  red..**.**     d
5200: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
5210: 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66  ze()     Size of
5220: 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73   only the Expr s
5230: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20  tructure .**    
5240: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5250: 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a 65 20  ze()       Size 
5260: 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63 65 20  of Expr + space 
5270: 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20  for token.**    
5280: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 29   dupedExprSize()
5290: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
52a0: 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65  + token + subtre
52b0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a  e components.**.
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
5310: 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72 53  * The dupedExprS
5320: 74 72 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63  tructSize() func
5330: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f  tion returns two
5340: 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f   values OR-ed to
5350: 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29  gether:  .** (1)
5360: 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69   the space requi
5370: 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f  red for a copy o
5380: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
5390: 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a  ture only and .*
53a0: 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78 78 78  * (2) the EP_xxx
53b0: 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69   flags that indi
53c0: 63 61 74 65 20 77 68 61 74 20 74 68 65 20 73 74  cate what the st
53d0: 72 75 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f  ructure size sho
53e0: 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72  uld be..** The r
53f0: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20  eturn values is 
5400: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a  always one of:.*
5410: 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46  *.**      EXPR_F
5420: 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20  ULLSIZE.**      
5430: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
5440: 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a     | EP_Reduced.
5450: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b  **      EXPR_TOK
5460: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
5470: 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20  TokenOnly.**.** 
5480: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
5490: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
54a0: 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e   found by maskin
54b0: 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  g the return val
54c0: 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f  ue.** of this ro
54d0: 75 74 69 6e 65 20 77 69 74 68 20 30 78 66 66 66  utine with 0xfff
54e0: 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e  .  The flags can
54f0: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5500: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75  king the.** retu
5510: 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20 45 50  rn value with EP
5520: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
5530: 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  nOnly..**.** Not
5540: 65 20 74 68 61 74 20 77 69 74 68 20 66 6c 61 67  e that with flag
5550: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
5560: 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73  E, this routines
5570: 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73   works on full-s
5580: 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65  ize.** (unreduce
5590: 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20  d) Expr objects 
55a0: 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69  as they or origi
55b0: 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65  nally constructe
55c0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
55d0: 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65  .** During expre
55e0: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20  ssion analysis, 
55f0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
5600: 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  n is computed an
5610: 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20  d moved into.** 
5620: 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66 20 74  later parts of t
5630: 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61  eh Expr object a
5640: 6e 64 20 74 68 61 74 20 65 78 74 72 61 20 69 6e  nd that extra in
5650: 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20  formation might 
5660: 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f  get chopped.** o
5670: 66 66 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ff if the expres
5680: 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e  sion is reduced.
5690: 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
56a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it does not wor
56b0: 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 20 45  k to.** make a E
56c0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f  XPRDUP_REDUCE co
56d0: 70 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20  py of a reduced 
56e0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20  expression.  It 
56f0: 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a  is only legal.**
5700: 20 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69   to reduce a pri
5710: 73 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e  stine expression
5720: 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70   tree from the p
5730: 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c  arser.  The impl
5740: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ementation.** of
5750: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5760: 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d  Size() contain m
5770: 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29  ultiple assert()
5780: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
5790: 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65   attempt.** to e
57a0: 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73  nforce this cons
57b0: 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  traint..*/.stati
57c0: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
57d0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
57e0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
57f0: 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73   int nSize;.  as
5800: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50  sert( flags==EXP
5810: 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66  RDUP_REDUCE || f
5820: 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e  lags==0 ); /* On
5830: 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75  ly one flag valu
5840: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 69  e allowed */.  i
5850: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
5860: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
5870: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
5880: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
5890: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
58a0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
58b0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
58c0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
58d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
58e0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
58f0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  p, EP_FromJoin) 
5900: 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  ); .    assert( 
5910: 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32  (p->flags2 & EP2
5920: 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d  _MallocedToken)=
5930: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5940: 28 20 28 70 2d 3e 66 6c 61 67 73 32 20 26 20 45  ( (p->flags2 & E
5950: 50 32 5f 49 72 72 65 64 75 63 69 62 6c 65 29 3d  P2_Irreducible)=
5960: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
5970: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 70 52 69  >pLeft || p->pRi
5980: 67 68 74 20 7c 7c 20 70 2d 3e 70 43 6f 6c 6c 20  ght || p->pColl 
5990: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
59a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
59b0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
59c0: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
59d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
59e0: 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45  Size = EXPR_TOKE
59f0: 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54  NONLYSIZE | EP_T
5a00: 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a  okenOnly;.    }.
5a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69    }.  return nSi
5a20: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
5a30: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5a40: 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20  ns the space in 
5a50: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
5a60: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79  o store the copy
5a70: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72   .** of the Expr
5a80: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
5a90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
5aa0: 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  r.u.zToken strin
5ab0: 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74  g (if that.** st
5ac0: 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e  ring is defined.
5ad0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
5ae0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
5af0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
5b00: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
5b10: 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74  te = dupedExprSt
5b20: 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67  ructSize(p, flag
5b30: 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66  s) & 0xfff;.  if
5b40: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5b50: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5b60: 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65  e) && p->u.zToke
5b70: 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b  n ){.    nByte +
5b80: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5b90: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31  0(p->u.zToken)+1
5ba0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52  ;.  }.  return R
5bb0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a  OUND8(nByte);.}.
5bc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5be0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  s required to cr
5bf0: 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65  eate a duplicate
5c00: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72   of the .** expr
5c10: 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73  ession passed as
5c20: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5c30: 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ent. The second 
5c40: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
5c50: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67   mask containing
5c60: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
5c70: 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  gs..**.** The va
5c80: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63  lue returned inc
5c90: 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63  ludes space to c
5ca0: 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20  reate a copy of 
5cb0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a  the Expr struct.
5cc0: 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68  ** itself and th
5cd0: 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65  e buffer referre
5ce0: 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a  d to by Expr.u.z
5cf0: 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a  Token, if any..*
5d00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52  *.** If the EXPR
5d10: 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20  DUP_REDUCE flag 
5d20: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
5d30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
5d40: 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65  cludes .** space
5d50: 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c   to duplicate al
5d60: 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20  l Expr nodes in 
5d70: 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20  the tree formed 
5d80: 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a  by Expr.pLeft .*
5d90: 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68  * and Expr.pRigh
5da0: 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74  t variables (but
5db0: 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72   not for any str
5dc0: 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20  uctures pointed 
5dd0: 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  to or .** descen
5de0: 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ded from the Exp
5df0: 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70  r.x.pList or Exp
5e00: 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69  r.x.pSelect vari
5e10: 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69  ables)..*/.stati
5e20: 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53  c int dupedExprS
5e30: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
5e40: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
5e50: 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Byte = 0;.  if( 
5e60: 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  p ){.    nByte =
5e70: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
5e80: 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ze(p, flags);.  
5e90: 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52    if( flags&EXPR
5ea0: 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20  DUP_REDUCE ){.  
5eb0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70      nByte += dup
5ec0: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c  edExprSize(p->pL
5ed0: 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75  eft, flags) + du
5ee0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
5ef0: 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Right, flags);. 
5f00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5f10: 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nByte;.}../*.*
5f20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5f30: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
5f40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20  lite3ExprDup(), 
5f50: 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70  except that if p
5f60: 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e  zBuffer .** is n
5f70: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a  ot NULL then *pz
5f80: 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65  Buffer is assume
5f90: 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  d to point to a 
5fa0: 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f  buffer large eno
5fb0: 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65  ugh .** to store
5fc0: 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70   the copy of exp
5fd0: 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63  ression p, the c
5fe0: 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54  opies of p->u.zT
5ff0: 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c  oken.** (if appl
6000: 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65  icable), and the
6010: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
6020: 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70  ->pLeft and p->p
6030: 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e  Right expression
6040: 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65  s,.** if any. Be
6050: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
6060: 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74  *pzBuffer is set
6070: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
6080: 74 65 20 70 61 73 73 65 64 20 74 68 65 0a 2a 2a  te passed the.**
6090: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
60a0: 62 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e  buffer copied in
60b0: 74 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  to by this funct
60c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ion..*/.static E
60d0: 78 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c  xpr *exprDup(sql
60e0: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
60f0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38  p, int flags, u8
6100: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
6110: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20  Expr *pNew = 0; 
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
6140: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28   return */.  if(
6150: 20 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20   p ){.    const 
6160: 69 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20  int isReduced = 
6170: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
6180: 45 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a  EDUCE);.    u8 *
6190: 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20  zAlloc;.    u32 
61a0: 73 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a  staticFlag = 0;.
61b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42  .    assert( pzB
61c0: 75 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65  uffer==0 || isRe
61d0: 64 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a  duced );..    /*
61e0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
61f0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
6200: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
6210: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a  e. */.    if( pz
6220: 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20  Buffer ){.      
6230: 7a 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66  zAlloc = *pzBuff
6240: 65 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  er;.      static
6250: 46 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63  Flag = EP_Static
6260: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6270: 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69     zAlloc = sqli
6280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
6290: 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65  b, dupedExprSize
62a0: 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20  (p, flags));.   
62b0: 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45   }.    pNew = (E
62c0: 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20  xpr *)zAlloc;.. 
62d0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
62e0: 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77       /* Set nNew
62f0: 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
6300: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
6310: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
6320: 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  nted to.      **
6330: 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69   by pNew. This i
6340: 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55  s either EXPR_FU
6350: 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44  LLSIZE, EXPR_RED
6360: 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20  UCEDSIZE or.    
6370: 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f    ** EXPR_TOKENO
6380: 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20  NLYSIZE. nToken 
6390: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
63a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f  mber of bytes co
63b0: 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20  nsumed.      ** 
63c0: 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74  by the copy of t
63d0: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
63e0: 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a  tring (if any)..
63f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
6400: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
6410: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
6420: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6430: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
6440: 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53   const int nNewS
6450: 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a  ize = nStructSiz
6460: 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20  e & 0xfff;.     
6470: 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20   int nToken;.   
6480: 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50     if( !ExprHasP
6490: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
64a0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
64b0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  zToken ){.      
64c0: 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    nToken = sqlit
64d0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
64e0: 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20  zToken) + 1;.   
64f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6500: 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20    nToken = 0;.  
6510: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6520: 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20  isReduced ){.   
6530: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
6540: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6550: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
6560: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
6570: 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77  (zAlloc, p, nNew
6580: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
6590: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
65a0: 6e 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75  nSize = exprStru
65b0: 63 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20  ctSize(p);.     
65c0: 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63     memcpy(zAlloc
65d0: 2c 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  , p, nSize);.   
65e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c       memset(&zAl
65f0: 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45  loc[nSize], 0, E
6600: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69  XPR_FULLSIZE-nSi
6610: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ze);.      }..  
6620: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
6630: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
6640: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
6650: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
6660: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
6670: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
6680: 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64   &= ~(EP_Reduced
6690: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50  |EP_TokenOnly|EP
66a0: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
66b0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 6e  pNew->flags |= n
66c0: 53 74 72 75 63 74 53 69 7a 65 20 26 20 28 45 50  StructSize & (EP
66d0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
66e0: 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 70 4e  nOnly);.      pN
66f0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 74 61  ew->flags |= sta
6700: 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20 20 20  ticFlag;..      
6710: 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d 3e 75  /* Copy the p->u
6720: 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 2c 20  .zToken string, 
6730: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
6740: 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
6750: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
6760: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
6770: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
6780: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
6790: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
67a0: 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f  zToken, p->u.zTo
67b0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
67c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
67d0: 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70   0==((p->flags|p
67e0: 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45 50  New->flags) & EP
67f0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
6800: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
6810: 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53  n the pNew->x.pS
6820: 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78  elect or pNew->x
6830: 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a  .pList member. *
6840: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  /.        if( Ex
6850: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6860: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
6870: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6880: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
6890: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
68a0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  b, p->x.pSelect,
68b0: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
68c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
68d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
68e0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
68f0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
6900: 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64 75 63  x.pList, isReduc
6910: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ed);.        }. 
6920: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
6930: 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70   Fill in pNew->p
6940: 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70  Left and pNew->p
6950: 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  Right. */.      
6960: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
6970: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
6980: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6990: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
69a0: 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64   zAlloc += duped
69b0: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
69c0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
69d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
69e0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
69f0: 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  uced) ){.       
6a00: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
6a10: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e   exprDup(db, p->
6a20: 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52  pLeft, EXPRDUP_R
6a30: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b  EDUCE, &zAlloc);
6a40: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
6a50: 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75  >pRight = exprDu
6a60: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c  p(db, p->pRight,
6a70: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c   EXPRDUP_REDUCE,
6a80: 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20   &zAlloc);.     
6a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6aa0: 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20   pzBuffer ){.   
6ab0: 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72         *pzBuffer
6ac0: 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = zAlloc;.     
6ad0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6ae0: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6af0: 66 6c 61 67 73 32 20 3d 20 30 3b 0a 20 20 20 20  flags2 = 0;.    
6b00: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
6b10: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
6b20: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6b30: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
6b40: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
6b50: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6b60: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
6b70: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
6b80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6b90: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
6ba0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
6bc0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
6bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
6be0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
6bf0: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
6c00: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
6c10: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
6c20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
6c30: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
6c40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
6c50: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
6c60: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
6c70: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
6c80: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
6c90: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
6ca0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
6cb0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
6cc0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
6cd0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
6ce0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
6cf0: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
6d00: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
6d10: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
6d20: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
6d30: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
6d40: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
6d50: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
6d60: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
6d70: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
6d80: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
6d90: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
6da0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
6db0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
6dc0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
6dd0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
6de0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
6df0: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
6e00: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
6e10: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
6e20: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
6e30: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6e40: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6e50: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6e60: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
6e70: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
6e80: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
6e90: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
6ea0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
6eb0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
6ec0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
6ed0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
6ee0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
6ef0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
6f00: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
6f10: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
6f20: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
6f30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
6f40: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
6f50: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
6f60: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
6f70: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
6f80: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
6f90: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
6fa0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
6fb0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
6fc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6fd0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
6fe0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
6ff0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7000: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
7010: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
7020: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
7030: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7040: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7050: 3e 69 45 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  >iECursor = 0;. 
7060: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
7070: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
7080: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
7090: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
70a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
70b0: 62 2c 20 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  b,  p->nExpr*siz
70c0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
70d0: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
70e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
70f0: 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ree(db, pNew);. 
7100: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7110: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
7120: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
7130: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
7140: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
7150: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
7160: 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  *pOldExpr = pOld
7170: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
7180: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
7190: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
71a0: 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61  b, pOldExpr, fla
71b0: 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  gs);.    pItem->
71c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
71d0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
71e0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
71f0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
7200: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7210: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7220: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
7230: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
7240: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
7250: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  r;.    pItem->do
7260: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ne = 0;.    pIte
7270: 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74  m->iCol = pOldIt
7280: 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49  em->iCol;.    pI
7290: 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f  tem->iAlias = pO
72a0: 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a  ldItem->iAlias;.
72b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
72c0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
72d0: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
72e0: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
72f0: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
7300: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
7310: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
7320: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
7330: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
7340: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
7350: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
7360: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
7370: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
7380: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
7390: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
73a0: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
73b0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
73c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
73d0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
73e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
73f0: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
7400: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
7410: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
7420: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
7430: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7440: 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74   SrcList *p, int
7450: 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69   flags){.  SrcLi
7460: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
7470: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
7480: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7490: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
74a0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
74b0: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
74c0: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
74d0: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
74e0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
74f0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
7500: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
7510: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7520: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
7530: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
7540: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
7550: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
7560: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7570: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
7580: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
7590: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
75a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
75b0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
75c0: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
75d0: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
75e0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
75f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7600: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
7610: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
7620: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
7630: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7640: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
7650: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
7660: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
7670: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
7680: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
7690: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
76a0: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
76b0: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
76c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
76d0: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
76e0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
76f0: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
7700: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
7710: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
7720: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64    pNewItem->zInd
7730: 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ex = sqlite3DbSt
7740: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
7750: 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
7760: 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64  pNewItem->notInd
7770: 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  exed = pOldItem-
7780: 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20  >notIndexed;.   
7790: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65   pNewItem->pInde
77a0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49  x = pOldItem->pI
77b0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d  ndex;.    pTab =
77c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
77d0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
77e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
77f0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
7800: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
7810: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
7820: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7830: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
7840: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67  m->pSelect, flag
7850: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
7860: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
7870: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
7880: 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29  tem->pOn, flags)
7890: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
78a0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
78b0: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  IdListDup(db, pO
78c0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
78d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
78e0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
78f0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
7900: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7910: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7920: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7930: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7940: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
7950: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
7960: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7970: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7980: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7990: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
79a0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
79b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
79c0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
79d0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
79e0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
79f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7a00: 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  w(db, p->nId*siz
7a10: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
7a20: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
7a30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7a40: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
7a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7a60: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
7a70: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
7a80: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
7a90: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
7aa0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7ab0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
7ac0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
7ad0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
7ae0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
7af0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7b00: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7b10: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
7b20: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
7b30: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
7b40: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
7b50: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
7b60: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
7b70: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
7b80: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
7b90: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
7ba0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7bb0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7bc0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7bd0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
7be0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7bf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
7c00: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
7c10: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7c20: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
7c30: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
7c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
7c50: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
7c60: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
7c70: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
7c80: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7c90: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
7ca0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
7cb0: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
7cc0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
7cd0: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
7ce0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
7cf0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
7d00: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
7d10: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
7d20: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
7d30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7d40: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
7d50: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7d60: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
7d70: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
7d80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7d90: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66  db, p->pPrior, f
7da0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
7db0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
7dc0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
7dd0: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
7de0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
7df0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7e00: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66  b, p->pOffset, f
7e10: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  lags);.  pNew->i
7e20: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
7e30: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->iOffset = 0;.
7e40: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
7e50: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
7e60: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
7e70: 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  al;.  pNew->pRig
7e80: 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e  htmost = 0;.  pN
7e90: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
7ea0: 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [0] = -1;.  pNew
7eb0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
7ec0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
7ed0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
7ee0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
7ef0: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
7f00: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
7f10: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
7f20: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
7f30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
7f40: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
7f50: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
7f60: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
7f70: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
7f80: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
7f90: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
7fa0: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
7fb0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
7fc0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
7fd0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
7fe0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
7ff0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
8000: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
8010: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
8020: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
8030: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
8040: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
8050: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
8060: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
8070: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
8080: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
8090: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
80a0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
80b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
80c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
80d0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
80e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
80f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8100: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
8110: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
8120: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
8130: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
8140: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
8150: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8160: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
8170: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8180: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
8190: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
81a0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
81b0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
81c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
81d0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
81e0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
81f0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8200: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
8210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8220: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
8230: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
8240: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
8250: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
8260: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8270: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
8280: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
8290: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
82a0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
82b0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
82c0: 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70  t->a, n*sizeof(p
82d0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
82e0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
82f0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8300: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8310: 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69  ->a = a;.    pLi
8320: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c  st->nAlloc = sql
8330: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
8340: 28 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61  (db, a)/sizeof(a
8350: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [0]);.  }.  asse
8360: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
8370: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
8380: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8390: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
83a0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
83b0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
83c0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
83d0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
83e0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
83f0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
8400: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
8410: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
8420: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
8430: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
8440: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
8450: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8460: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
8470: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8480: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
8490: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
84a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
84b0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
84c0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
84d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
84e0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
84f0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8500: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
8510: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
8520: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
8530: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
8540: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
8550: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
8560: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
8570: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
8580: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8590: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
85a0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
85b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
85c0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
85d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
85e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
85f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8600: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8610: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
8620: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
8630: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
8640: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
8650: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
8660: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
8670: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
8680: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
8690: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
86a0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
86b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
86c0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
86d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
86e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
86f0: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
8700: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8710: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
8720: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
8730: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
8740: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
8750: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
8760: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
8770: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
8780: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
8790: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
87a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
87b0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
87c0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
87d0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
87e0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
87f0: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
8800: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
8810: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
8820: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
8830: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
8840: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
8850: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
8860: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8870: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
8880: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
8890: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
88a0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
88b0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
88c0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
88d0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
88e0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
88f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
8900: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
8910: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
8920: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
8930: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8940: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8950: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8960: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8970: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
8980: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
8990: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
89a0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
89b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
89c0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
89d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
89e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
89f0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
8a00: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8a10: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
8a20: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
8a30: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8a40: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
8a50: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
8a60: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
8a70: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
8a80: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
8a90: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
8aa0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
8ab0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
8ac0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
8ad0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
8ae0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
8af0: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
8b00: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8b10: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
8b20: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
8b50: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
8b60: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
8b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
8b80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8b90: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
8ba0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
8bb0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
8bc0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
8bd0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
8be0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
8bf0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
8c00: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
8c10: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
8c20: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
8c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
8c40: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
8c50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
8c60: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8c70: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
8c80: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
8c90: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
8ca0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
8cb0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
8cc0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
8cd0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
8ce0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
8cf0: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
8d00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8d10: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
8d20: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
8d30: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
8d40: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
8d50: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
8d60: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
8d70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8d80: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
8d90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8da0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
8db0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8dc0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
8dd0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
8de0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
8df0: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
8e00: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
8e10: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
8e20: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
8e30: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
8e40: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
8e50: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
8e60: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
8e70: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
8e80: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
8e90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8ea0: 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  b, pItem->pExpr)
8eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8ec0: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
8ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
8ee0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
8ef0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a  em->zSpan);.  }.
8f00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8f10: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
8f20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f30: 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
8f40: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
8f50: 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61  es are Walker ca
8f60: 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72  llbacks.  Walker
8f70: 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74  .u.pi is a point
8f80: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65  er.** to an inte
8f90: 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ger.  These rout
8fa0: 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e  ines are checkin
8fb0: 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
8fc0: 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20  to see.** if it 
8fd0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20  is a constant.  
8fe0: 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69  Set *Walker.u.pi
8ff0: 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78 70   to 0 if the exp
9000: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f  ression is.** no
9010: 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a  t constant..**.*
9020: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
9030: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
9040: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
9050: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9060: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
9070: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
9080: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
9090: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
90a0: 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71  Join().**     sq
90b0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
90c0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a  antOrFunction().
90d0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
90e0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
90f0: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
9100: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
9110: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
9120: 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68  ker->u.i is 3 th
9130: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
9140: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
9150: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
9160: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
9170: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
9180: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
9190: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
91a0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
91b0: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
91c0: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tant. */.  if( p
91d0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26  Walker->u.i==3 &
91e0: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
91f0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
9200: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
9210: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
9220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
9230: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73  _Abort;.  }..  s
9240: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9250: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
9260: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
9270: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
9280: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
9290: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
92a0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c  .    ** and pWal
92b0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20  ker->u.i==2 */. 
92c0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
92d0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
92e0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29  Walker->u.i==2 )
92f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
9300: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
9310: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
9320: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
9330: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
9340: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
9350: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
9360: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
9370: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
9380: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
9390: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
93a0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
93b0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
93c0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
93d0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
93e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
93f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9400: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9410: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
9420: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
9430: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9440: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9450: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
9460: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
9470: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
9480: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
9490: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
94a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
94b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
94c0: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
94d0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
94e0: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
94f0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
9500: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
9510: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9520: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
9530: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
9540: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
9550: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
9560: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
9570: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
9580: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
9590: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
95a0: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
95b0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
95c0: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
95d0: 72 20 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69  r w;.  w.u.i = i
95e0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
95f0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
9600: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
9610: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
9620: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
9630: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73  eIsConstant;.  s
9640: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
9650: 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  w, p);.  return 
9660: 77 2e 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w.u.i;.}../*.** 
9670: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
9680: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
9690: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
96a0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
96b0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
96c0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
96d0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
96e0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
96f0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
9700: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
9710: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
9720: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
9730: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
9740: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
9750: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
9760: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
9770: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
9780: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
9790: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
97a0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
97b0: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
97c0: 73 74 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 1);.}../*.
97d0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
97e0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
97f0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
9800: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
9810: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
9820: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
9830: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
9840: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
9850: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
9860: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
9870: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
9880: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
9890: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
98a0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
98b0: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
98c0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
98d0: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
98e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
98f0: 49 73 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d  IsConst(p, 3);.}
9900: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
9910: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
9920: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
9930: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9940: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
9950: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
9960: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
9970: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
9980: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
9990: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
99a0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
99b0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
99c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
99d0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
99e0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
99f0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
9a00: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
9a10: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
9a20: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
9a30: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
9a40: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
9a50: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9a60: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
9a70: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
9a80: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32  exprIsConst(p, 2
9a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
9aa0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
9ab0: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
9ac0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
9ad0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
9ae0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
9af0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
9b00: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
9b10: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
9b20: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
9b30: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
9b40: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
9b50: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
9b60: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
9b70: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
9b80: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
9b90: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
9ba0: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
9bb0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
9bc0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
9bd0: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
9be0: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
9bf0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
9c00: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
9c10: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
9c20: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
9c30: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
9c40: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
9c50: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
9c60: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
9c70: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
9c80: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d  lite3GetInt32(p-
9c90: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 56 61 6c 75  >u.zToken, pValu
9ca0: 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
9cb0: 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ( rc==0 );.     
9cc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9cd0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
9ce0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
9cf0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9d00: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
9d10: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
9d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9d30: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
9d40: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
9d50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9d60: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
9d70: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
9d80: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
9d90: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
9da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9dc0: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
9dd0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
9de0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70  .    assert( Exp
9df0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
9e00: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  p, EP_Reduced|EP
9e10: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 0a 20 20 20 20  _TokenOnly).    
9e20: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
9e30: 2d 3e 66 6c 61 67 73 32 20 26 20 45 50 32 5f 4d  ->flags2 & EP2_M
9e40: 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e 29 3d 3d 30  allocedToken)==0
9e50: 20 29 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20   );.    p->op = 
9e60: 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
9e70: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  p->flags |= EP_I
9e80: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e  ntValue;.    p->
9e90: 75 2e 69 56 61 6c 75 65 20 3d 20 2a 70 56 61 6c  u.iValue = *pVal
9ea0: 75 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ue;.  }.  return
9eb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
9ec0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
9ed0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
9ee0: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
9ef0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
9f00: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
9f10: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9f20: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9f30: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
9f40: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9f50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9f60: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
9f70: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9f80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9f90: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
9fa0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
9fb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9fc0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
9fd0: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
9fe0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
9ff0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
a000: 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  a.** query of th
a010: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
a020: 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
a030: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  ...).**.** Where
a040: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 63   the SELECT... c
a050: 6c 61 75 73 65 20 69 73 20 61 73 20 73 70 65 63  lause is as spec
a060: 69 66 69 65 64 20 62 79 20 74 68 65 20 70 61 72  ified by the par
a070: 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 0a 2a  ameter to this.*
a080: 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  * routine..**.**
a090: 20 54 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   The Select obje
a0a0: 63 74 20 70 61 73 73 65 64 20 69 6e 20 68 61 73  ct passed in has
a0b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a0c0: 65 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 6e  eprocessed and n
a0d0: 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68 61 76 65  o.** errors have
a0e0: 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 2a 2f 0a   been found..*/.
a0f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a100: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73 74 61  MIT_SUBQUERY.sta
a110: 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64 69 64  tic int isCandid
a120: 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65  ateForInOpt(Sele
a130: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
a140: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
a150: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
a160: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 66  able *pTab;.  if
a170: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
a180: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
a190: 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d 68 61       /* right-ha
a1a0: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 69 73  nd side of IN is
a1b0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
a1c0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74   p->pPrior ) ret
a1d0: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
a1e0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d      /* Not a com
a1f0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
a200: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
a210: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
a220: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
a230: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
a240: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
a250: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
a260: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
a270: 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74  istinct );.    t
a280: 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c  estcase( (p->sel
a290: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
a2a0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
a2b0: 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
a2c0: 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
a2d0: 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43  0; /* No DISTINC
a2e0: 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f  T keyword and no
a2f0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a300: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73  ions */.  }.  as
a310: 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
a320: 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  y==0 );         
a330: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47       /* Has no G
a340: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
a350: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
a360: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
a370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
a380: 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73  s no LIMIT claus
a390: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  e */.  assert( p
a3a0: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a3c0: 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20   No LIMIT means 
a3d0: 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  no OFFSET */.  i
a3e0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
a3f0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
a400: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
a410: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
a420: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
a430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
a440: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72  !=0 );.  if( pSr
a450: 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
a460: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
a470: 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69  /* Single term i
a480: 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  n FROM clause */
a490: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
a4a0: 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ].pSelect ) retu
a4b0: 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f  rn 0;     /* FRO
a4c0: 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75  M is not a subqu
a4d0: 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ery or view */. 
a4e0: 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b   pTab = pSrc->a[
a4f0: 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 4e  0].pTab;.  if( N
a500: 45 56 45 52 28 70 54 61 62 3d 3d 30 29 20 29 20  EVER(pTab==0) ) 
a510: 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
a520: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
a530: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
a540: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
a550: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
a560: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
a570: 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
a580: 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  n 0;        /* F
a590: 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61  ROM clause not a
a5a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
a5b0: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
a5c0: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  pEList;.  if( pE
a5d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
a5e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
a5f0: 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69   /* One column i
a600: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a610: 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74   */.  if( pEList
a620: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
a630: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
a640: 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c  turn 0; /* Resul
a650: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  t is a column */
a660: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a670: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a680: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
a690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
a6a0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ction is used by
a6b0: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
a6c0: 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e  ion of the IN (.
a6d0: 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ..) operator..**
a6e0: 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20   It's job is to 
a6f0: 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
a700: 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
a710: 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  e that may be us
a720: 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20  ed.** either to 
a730: 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73  test for members
a740: 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29  hip of the (...)
a750: 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61   set or to itera
a760: 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74  te through.** it
a770: 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70  s members, skipp
a780: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
a790: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
a7a0: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 6f 70  of the cursor op
a7b0: 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72  ened on the b-tr
a7c0: 65 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62  ee (database tab
a7d0: 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64  le, database ind
a7e0: 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d  ex .** or epherm
a7f0: 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f  al table) is sto
a800: 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c  red in pX->iTabl
a810: 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
a820: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
a830: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
a840: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
a850: 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73  nction indicates
a860: 20 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65   the b-tree type
a870: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
a880: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52  .**   IN_INDEX_R
a890: 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f  OWID - The curso
a8a0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
a8b0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
a8c0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
a8d0: 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73  INDEX - The curs
a8e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
a8f0: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65   a database inde
a900: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
a910: 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72  _EPH -   The cur
a920: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
a930: 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72  n a specially cr
a940: 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20  eated and.**    
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65  populated ephere
a970: 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  mal table..**.**
a980: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74   An existing b-t
a990: 72 65 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ree may only be 
a9a0: 75 73 65 64 20 69 66 20 74 68 65 20 53 45 4c 45  used if the SELE
a9b0: 43 54 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d  CT is of the sim
a9c0: 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a  ple.** form:.**.
a9d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63  **     SELECT <c
a9e0: 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62  olumn> FROM <tab
a9f0: 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le>.**.** If the
aa00: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
aa10: 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
aa20: 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c   the b-tree will
aa30: 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
aa40: 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
aa50: 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 2c 20  he set members, 
aa60: 73 6b 69 70 70 69 6e 67 20 61 6e 79 20 64 75 70  skipping any dup
aa70: 6c 69 63 61 74 65 73 2e 20 49 6e 20 74 68 69 73  licates. In this
aa80: 20 63 61 73 65 20 61 6e 0a 2a 2a 20 65 70 68 65   case an.** ephe
aa90: 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74  remal table must
aaa0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
aab0: 74 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f  the selected <co
aac0: 6c 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74  lumn> is guarant
aad0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69  eed.** to be uni
aae0: 71 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63  que - either bec
aaf0: 61 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e  ause it is an IN
ab00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ab10: 59 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61  Y or it.** has a
ab20: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
ab30: 6e 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  nt or UNIQUE ind
ab40: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ex..**.** If the
ab50: 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72 61   prNotFound para
ab60: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
ab70: 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  then the b-tree 
ab80: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
ab90: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
aba0: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20  mbership tests. 
abb0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20  In this case an 
abc0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
abd0: 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64  must .** be used
abe0: 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e   unless <column>
abf0: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
ac00: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e  RIMARY KEY or an
ac10: 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62   index can .** b
ac20: 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f  e found with <co
ac30: 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66  lumn> as its lef
ac40: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
ac50: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 62 2d  *.** When the b-
ac60: 74 72 65 65 20 69 73 20 62 65 69 6e 67 20 75 73  tree is being us
ac70: 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ed for membershi
ac80: 70 20 74 65 73 74 73 2c 20 74 68 65 20 63 61 6c  p tests, the cal
ac90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
aca0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
acb0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
acc0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
acd0: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
ace0: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
acf0: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
ad00: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
ad10: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
ad20: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
ad30: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
ad40: 65 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  e that the b-tre
ad50: 65 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  e might contain 
ad60: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a  a NULL value at.
ad70: 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e  ** runtime, then
ad80: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
ad90: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
ada0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
adb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a   written.** to *
adc0: 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20 74  prNotFound. If t
add0: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
ade0: 65 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  e that the b-tre
adf0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  e contains a.** 
ae00: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
ae10: 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 69 73 20   *prNotFound is 
ae20: 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
ae30: 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73  **.** If a regis
ae40: 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ter is allocated
ae50: 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f   and its locatio
ae60: 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 4e  n stored in *prN
ae70: 6f 74 46 6f 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a  otFound, then.**
ae80: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 76 61 6c   its initial val
ae90: 75 65 20 69 73 20 4e 55 4c 4c 2e 20 49 66 20 74  ue is NULL. If t
aea0: 68 65 20 62 2d 74 72 65 65 20 64 6f 65 73 20 6e  he b-tree does n
aeb0: 6f 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61  ot remain consta
aec0: 6e 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75  nt.** for the du
aed0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75  ration of the qu
aee0: 65 72 79 20 28 69 2e 65 2e 20 74 68 65 20 53 45  ery (i.e. the SE
aef0: 4c 45 43 54 20 74 68 61 74 20 67 65 6e 65 72 61  LECT that genera
af00: 74 65 73 20 74 68 65 20 62 2d 74 72 65 65 0a 2a  tes the b-tree.*
af10: 2a 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  * is a correlate
af20: 64 20 73 75 62 71 75 65 72 79 29 20 74 68 65 6e  d subquery) then
af30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
af40: 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69  e allocated regi
af50: 73 74 65 72 20 69 73 0a 2a 2a 20 72 65 73 65 74  ster is.** reset
af60: 20 74 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69   to NULL each ti
af70: 6d 65 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  me the b-tree is
af80: 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54 68   repopulated. Th
af90: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a  is allows the.**
afa0: 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76   caller to use v
afb0: 64 62 65 20 63 6f 64 65 20 65 71 75 69 76 61 6c  dbe code equival
afc0: 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ent to the follo
afd0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  wing:.**.**   if
afe0: 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c  ( register==NULL
aff0: 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e   ){.**     has_n
b000: 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64  ull = <test if d
b010: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
b020: 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20  ntains null>.** 
b030: 20 20 20 20 72 65 67 69 73 74 65 72 20 3d 20 31      register = 1
b040: 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e  .**   }.**.** in
b050: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
b060: 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73  running the <tes
b070: 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74  t if data struct
b080: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c  ure contains nul
b090: 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20  l>.** test more 
b0a0: 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65  often than is ne
b0b0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e  cessary..*/.#ifn
b0c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b0d0: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
b0e0: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
b0f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
b100: 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72  xpr *pX, int *pr
b110: 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c  NotFound){.  Sel
b120: 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
b150: 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
b160: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
b170: 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
b1a0: 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
b1b0: 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
b1c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
b1d0: 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
b1e0: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
b1f0: 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
b200: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
b210: 20 3d 20 28 70 72 4e 6f 74 46 6f 75 6e 64 3d 3d   = (prNotFound==
b220: 30 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  0);   /* True if
b230: 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
b240: 71 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  que */..  /* Che
b250: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20  ck to see if an 
b260: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f  existing table o
b270: 72 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  r index can be u
b280: 73 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69  sed to.  ** sati
b290: 73 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20  sfy the query.  
b2a0: 54 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62  This is preferab
b2b0: 6c 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67  le to generating
b2c0: 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68   a new .  ** eph
b2d0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20  emeral table..  
b2e0: 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61  */.  p = (ExprHa
b2f0: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
b300: 5f 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58  _xIsSelect) ? pX
b310: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29  ->x.pSelect : 0)
b320: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
b330: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20  Parse->nErr==0) 
b340: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
b350: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
b360: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b370: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
b380: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b390: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b3a0: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
b3b0: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
b3c0: 5b 30 5d 2e 70 45 78 70 72 3b 20 20 20 2f 2a 20  [0].pExpr;   /* 
b3d0: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
b3e0: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  mn> */.    int i
b3f0: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
b400: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lumn;           
b410: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
b420: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
b430: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
b440: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b450: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
b460: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
b470: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
b480: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b490: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
b4a0: 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  ab;      /* Tabl
b4b0: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
b4c0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b4f0: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
b500: 62 20 2a 2f 0a 20 20 20 0a 20 20 20 20 2f 2a 20  b */.   .    /* 
b510: 43 6f 64 65 20 61 6e 20 4f 50 5f 56 65 72 69 66  Code an OP_Verif
b520: 79 43 6f 6f 6b 69 65 20 61 6e 64 20 4f 50 5f 54  yCookie and OP_T
b530: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
b540: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
b550: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b560: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
b570: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
b580: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
b590: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
b5a0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
b5b0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
b5c0: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
b5d0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
b5e0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
b5f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
b600: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
b610: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
b620: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
b630: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
b640: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
b650: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
b660: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
b670: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
b680: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
b690: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
b6a0: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
b6b0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
b6c0: 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
b6d0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
b6e0: 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20   int iAddr;.    
b6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
b700: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
b710: 0a 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73  .      iAddr = s
b720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b730: 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29  (v, OP_If, iMem)
b740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b750: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b760: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d  Integer, 1, iMem
b770: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
b780: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
b790: 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
b7a0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
b7b0: 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20  ;.      eType = 
b7c0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a  IN_INDEX_ROWID;.
b7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41  beJumpHere(v, iA
b7f0: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
b800: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
b810: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
b820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b830: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
b840: 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
b850: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
b860: 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68 65  ence used by the
b870: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20   comparison. If 
b880: 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20  an index is to. 
b890: 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20       ** be used 
b8a0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65  in place of a te
b8b0: 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73  mp-table, it mus
b8c0: 74 20 62 65 20 6f 72 64 65 72 65 64 20 61 63 63  t be ordered acc
b8d0: 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ording.      ** 
b8e0: 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  to this collatio
b8f0: 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  n sequence.  */.
b900: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
b910: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
b920: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
b930: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
b940: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
b950: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
b960: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
b970: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
b980: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
b990: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
b9a0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
b9b0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
b9c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
b9d0: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
b9e0: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
b9f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
ba00: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
ba10: 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
ba20: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
ba30: 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20  Affinity(pX);.  
ba40: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
ba50: 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f  _ok = (pTab->aCo
ba60: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
ba70: 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49  ==aff||aff==SQLI
ba80: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20  TE_AFF_NONE);.. 
ba90: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
baa0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
bab0: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
bac0: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
bad0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
bae0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
baf0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
bb00: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
bb10: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
bb20: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
bb30: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
bb40: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
bb50: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
bb60: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
bb70: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70  >nColumn==1 && p
bb80: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
bb90: 5f 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20  _None)).        
bba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
bbb0: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
bbc0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
bbd0: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20    int iAddr;.   
bbe0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65         char *pKe
bbf0: 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  y;.  .          
bc00: 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73  pKey = (char *)s
bc10: 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
bc20: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
bc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62 20  ;.          iDb 
bc40: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
bc50: 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d  oIndex(db, pIdx-
bc60: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc80: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
bc90: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41  );..          iA
bca0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bcb0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
bcc0: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
bcd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bce0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
bcf0: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, 1, iMem);.  
bd00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bd10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
bd20: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
bd30: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
bd40: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e     pKey,P4_KEYIN
bd70: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
bd80: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
bd90: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
bda0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
bdb0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
bdc0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20  _INDEX_INDEX;.. 
bdd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bde0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bdf0: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
be00: 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64    if( prNotFound
be10: 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b   && !pTab->aCol[
be20: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
be30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
be40: 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61  NotFound = ++pPa
be50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
be70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be80: 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d   }..  if( eType=
be90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
bea0: 6c 64 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 20  ld not found an 
beb0: 65 78 69 73 74 69 6e 67 20 61 62 6c 65 20 6f 72  existing able or
bec0: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
bed0: 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
bee0: 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
bef0: 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
bf00: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
bf10: 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
bf20: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  b..    */.    in
bf30: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
bf40: 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
bf50: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
bf60: 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64    if( prNotFound
bf70: 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74   ){.      *prNot
bf80: 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65  Found = rMayHave
bf90: 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Null = ++pParse-
bfa0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65  >nMem;.    }else
bfb0: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
bfc0: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
bfd0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
bfe0: 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pX, EP_xIsSelec
bff0: 74 29 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70  t) ){.      eTyp
c000: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  e = IN_INDEX_ROW
c010: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ID;.    }.    sq
c020: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
c030: 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72  ct(pParse, pX, r
c040: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79  MayHaveNull, eTy
c050: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
c060: 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ID);.  }else{.  
c070: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
c080: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
c090: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
c0a0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
c0b0: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
c0c0: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
c0d0: 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69  d as an expressi
c0e0: 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65  on.** and IN ope
c0f0: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
c100: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
c110: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
c120: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
c130: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
c140: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
c150: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
c160: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
c170: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
c180: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
c190: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
c1a0: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
c1b0: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
c1c0: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
c1d0: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
c1e0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
c1f0: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
c200: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
c210: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
c220: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
c230: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
c240: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
c250: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
c260: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
c270: 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
c280: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
c290: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
c2a0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
c2b0: 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
c2c0: 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
c2d0: 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
c2e0: 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
c2f0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
c300: 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
c310: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
c320: 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
c330: 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
c340: 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
c350: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
c360: 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
c370: 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
c380: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
c390: 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
c3a0: 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
c3b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
c3c0: 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
c3d0: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
c3e0: 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
c3f0: 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
c400: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
c410: 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
c420: 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
c430: 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
c440: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 74  * Furthermore, t
c450: 68 65 20 49 4e 20 69 73 20 69 6e 20 61 20 57 48  he IN is in a WH
c460: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 74  ERE clause and t
c470: 68 61 74 20 77 65 20 72 65 61 6c 6c 79 20 77 61  hat we really wa
c480: 6e 74 0a 2a 2a 20 74 6f 20 69 74 65 72 61 74 65  nt.** to iterate
c490: 20 6f 76 65 72 20 74 68 65 20 52 48 53 20 6f 66   over the RHS of
c4a0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
c4b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 71 75 69   in order to qui
c4c0: 63 6b 6c 79 20 6c 6f 63 61 74 65 0a 2a 2a 20 61  ckly locate.** a
c4d0: 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ll corresponding
c4e0: 20 4c 48 53 20 65 6c 65 6d 65 6e 74 73 2e 20 20   LHS elements.  
c4f0: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
c500: 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c   does is initial
c510: 69 7a 65 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ize.** the regis
c520: 74 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61  ter given by rMa
c530: 79 48 61 76 65 4e 75 6c 6c 20 74 6f 20 4e 55 4c  yHaveNull to NUL
c540: 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74  L.  Calling rout
c550: 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 0a 2a  ines will take.*
c560: 2a 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69  * care of changi
c570: 6e 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ng this register
c580: 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55   value to non-NU
c590: 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69 73  LL if the RHS is
c5a0: 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a   NULL-free..**.*
c5b0: 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c  * If rMayHaveNul
c5c0: 6c 20 69 73 20 7a 65 72 6f 2c 20 74 68 61 74 20  l is zero, that 
c5d0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73  means that the s
c5e0: 75 62 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  ubquery is being
c5f0: 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 6d 65 6d   used.** for mem
c600: 62 65 72 73 68 69 70 20 74 65 73 74 69 6e 67 20  bership testing 
c610: 6f 6e 6c 79 2e 20 20 54 68 65 72 65 20 69 73 20  only.  There is 
c620: 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 69 74 69  no need to initi
c630: 61 6c 69 7a 65 20 61 6e 79 0a 2a 2a 20 72 65 67  alize any.** reg
c640: 69 73 74 65 72 73 20 74 6f 20 69 6e 64 69 63 61  isters to indica
c650: 74 65 20 74 68 65 20 70 72 65 73 65 6e 73 65 20  te the presense 
c660: 6f 72 20 61 62 73 65 6e 63 65 20 6f 66 20 4e 55  or absence of NU
c670: 4c 4c 73 20 6f 6e 20 74 68 65 20 52 48 53 2e 0a  LLs on the RHS..
c680: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c690: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c6a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
c6b0: 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
c6c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c6d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c6e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
c6f0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
c700: 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20       /* The IN, 
c710: 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54  SELECT, or EXIST
c720: 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  S operator */.  
c730: 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
c740: 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
c750: 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64 73  ter that records
c760: 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65   whether NULLs e
c770: 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20  xist in RHS */. 
c780: 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20   int isRowid    
c790: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
c7a0: 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f  rue, LHS of IN o
c7b0: 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77  perator is a row
c7c0: 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 74  id */.){.  int t
c7d0: 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20  estAddr = 0;    
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
c800: 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
c810: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
c820: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c830: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
c840: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
c850: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
c860: 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a  ePush(pParse);..
c870: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
c880: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
c890: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
c8a0: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
c8b0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
c8c0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
c8d0: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
c8e0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
c8f0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
c900: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
c910: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
c920: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
c930: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
c940: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
c950: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
c960: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
c970: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
c980: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
c990: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
c9a0: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
c9b0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
c9c0: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
c9d0: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
c9e0: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
c9f0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
ca00: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
ca10: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
ca20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
ca30: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
ca40: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
ca50: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
ca60: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
ca70: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50    int mem = ++pP
ca80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
ca90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caa0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29  1(v, OP_If, mem)
cab0: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
cac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cad0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cae0: 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61  , 1, mem);.    a
caf0: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
cb00: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
cb10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cb20: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
cb30: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
cb40: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
cb50: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
cb60: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
cb70: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
cb80: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
cb90: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
cba0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
cbb0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
cbc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
cbd0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
cbe0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61  ;..      if( rMa
cbf0: 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20  yHaveNull ){.   
cc00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cc10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
cc20: 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  l, 0, rMayHaveNu
cc30: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ll);.      }..  
cc40: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
cc50: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
cc60: 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  ty(pLeft);..    
cc70: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
cc80: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
cc90: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
cca0: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
ccb0: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
ccc0: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
ccd0: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
cce0: 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  y. A virtual tab
ccf0: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
cd00: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
cd10: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
cd20: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
cd30: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
cd40: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
cd50: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
cd60: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
cd70: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
cd80: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
cd90: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
cda0: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
cdb0: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
cdc0: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
cdd0: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
cde0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
cdf0: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
ce00: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
ce10: 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
ce20: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
ce30: 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
ce40: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
ce50: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
ce60: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
ce70: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
ce80: 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
ce90: 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
cea0: 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
ceb0: 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
cec0: 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
ced0: 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
cee0: 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
cef0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
cf00: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
cf10: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
cf20: 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
cf30: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
cf40: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
cf50: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
cf60: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cf70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
cf80: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
cf90: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
cfa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65  Rowid);.      me
cfb0: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
cfc0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
cfd0: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
cfe0: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20  o.nField = 1;.. 
cff0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
d000: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d010: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
d020: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
d030: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
d040: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
d050: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
d060: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
d070: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
d080: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
d090: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
d0a0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
d0b0: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
d0c0: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
d0d0: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
d0e0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
d0f0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  t dest;.        
d100: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d110: 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
d120: 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20  t( !isRowid );. 
d130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
d140: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
d150: 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78  st, SRT_Set, pEx
d160: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
d170: 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e 69       dest.affini
d180: 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  ty = (u8)affinit
d190: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
d1a0: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
d1b0: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
d1c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
d1d0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d1e0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d1f0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
d200: 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
d210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
d220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d230: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
d240: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
d250: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ist;.        if(
d260: 20 41 4c 57 41 59 53 28 70 45 4c 69 73 74 21 3d   ALWAYS(pEList!=
d270: 30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 && pEList->nEx
d280: 70 72 3e 30 29 20 29 7b 20 0a 20 20 20 20 20 20  pr>0) ){ .      
d290: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
d2a0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
d2b0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
d2c0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
d2d0: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
d2e0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
d2f0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
d300: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
d310: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70  e if( pExpr->x.p
d320: 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  List!=0 ){.     
d330: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
d340: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
d350: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
d360: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
d370: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
d380: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
d390: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
d3a0: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
d3b0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
d3c0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
d3d0: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
d3e0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
d3f0: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
d400: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
d410: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
d420: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
d430: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
d440: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
d450: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
d460: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
d470: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
d490: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
d4a0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
d4b0: 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
d4c0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
d4d0: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
d4e0: 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
d4f0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
d500: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
d510: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
d520: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
d530: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d540: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
d550: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
d560: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d570: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
d580: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74         /* Loop t
d590: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
d5a0: 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c  ession in <exprl
d5b0: 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ist>. */.       
d5c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
d5d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d5e0: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
d5f0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d600: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d620: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
d630: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
d640: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
d650: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
d660: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
d670: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
d680: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
d690: 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
d6a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
d6b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
d6c0: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
d6d0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
d6e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
d6f0: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
d700: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
d710: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
d720: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
d730: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
d740: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
d750: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
d760: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
d770: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
d780: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
d790: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
d7a0: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
d7b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d7c0: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20     if( testAddr 
d7d0: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
d7e0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
d7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
d800: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
d810: 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64  oNoop(v, testAdd
d820: 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  r-1, 2);.       
d830: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
d840: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
d850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
d860: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
d870: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
d880: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
d890: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
d8a0: 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
d8b0: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
d8c0: 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d8e0: 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  sRowid ){.      
d8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d900: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
d910: 73 74 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c  stBeInt, r3, sql
d920: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d930: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
d940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d950: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
d960: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
d970: 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
d980: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d990: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
d9b0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
d9c0: 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
d9d0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
d9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d9f0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
da00: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c  ange(pParse, r3,
da10: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
da20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da30: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
da40: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
da50: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
da60: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
da70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
da80: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
da90: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
daa0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
dab0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
dac0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
dad0: 20 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29    if( !isRowid )
dae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
daf0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
db00: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
db10: 6b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  keyInfo, P4_KEYI
db20: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
db30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
db40: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
db50: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
db60: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65  K_SELECT:.    de
db70: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
db80: 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f  * If this has to
db90: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
dba0: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
dbb0: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
dbc0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
dbd0: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
dbe0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
dbf0: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
dc00: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
dc10: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
dc20: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20  in iColumn.  If 
dc30: 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54  this is an EXIST
dc40: 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  S, write.      *
dc50: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28  * an integer 0 (
dc60: 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31  not exists) or 1
dc70: 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61   (exists) into a
dc80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20   memory cell.   
dc90: 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64     ** and record
dca0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
dcb0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
dcc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
dcd0: 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  tic const Token 
dce0: 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20 31 20 7d  one = { "1", 1 }
dcf0: 3b 20 20 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20  ;  /* Token for 
dd00: 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20 31 20  literal value 1 
dd10: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
dd20: 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20  *pSel;          
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd40: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
dd50: 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a  nt to encode */.
dd60: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
dd70: 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20   dest;          
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
dd90: 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ow to deal with 
dda0: 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f  SELECt result */
ddb0: 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
ddc0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
ddd0: 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
dde0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
ddf0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
de00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
de10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
de20: 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
de30: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
de40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
de50: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
de60: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
de70: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65  ct) );.      pSe
de80: 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
de90: 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  lect;.      sqli
dea0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
deb0: 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50  t(&dest, 0, ++pP
dec0: 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  arse->nMem);.   
ded0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
dee0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
def0: 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
df00: 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  t = SRT_Mem;.   
df10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
df20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
df30: 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d  l, 0, dest.iParm
df40: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
df50: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
df60: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
df70: 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
df80: 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
df90: 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
dfa0: 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
dfb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dfc0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
dfd0: 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20  est.iParm);.    
dfe0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
dff0: 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
e000: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
e010: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e020: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
e030: 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
e040: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
e050: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
e060: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
e070: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
e080: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
e090: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
e0a0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
e0b0: 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
e0c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
e0d0: 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  }.      pExpr->i
e0e0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 29 64 65  Column = (i16)de
e0f0: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
e100: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
e110: 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
e120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e130: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
e140: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e150: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e160: 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 7d  testAddr-1);.  }
e170: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
e180: 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31  chePop(pParse, 1
e190: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  );..  return;.}.
e1a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e1b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
e1c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  /../*.** Duplica
e1d0: 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c  te an 8-byte val
e1e0: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
e1f0: 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62  r *dup8bytes(Vdb
e200: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
e210: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f   *in){.  char *o
e220: 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ut = sqlite3DbMa
e230: 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56  llocRaw(sqlite3V
e240: 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20  dbeDb(v), 8);.  
e250: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d  if( out ){.    m
e260: 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38  emcpy(out, in, 8
e270: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e280: 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  out;.}../*.** Ge
e290: 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
e2a0: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
e2b0: 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
e2c0: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
e2d0: 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
e2e0: 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
e2f0: 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
e300: 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
e310: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
e320: 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
e330: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
e340: 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
e350: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
e360: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
e370: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
e380: 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
e390: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
e3a0: 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
e3b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
e3c0: 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
e3d0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
e3e0: 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
e3f0: 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
e400: 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
e410: 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
e420: 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
e430: 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
e440: 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20  value);.    if( 
e450: 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c  sqlite3IsNaN(val
e460: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ue) ){.      sql
e470: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e480: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d  , OP_Null, 0, iM
e490: 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  em);.    }else{.
e4a0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 61 74 65        if( negate
e4b0: 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
e4c0: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20  value;.      zV 
e4d0: 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
e4e0: 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
e4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e500: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61  AddOp4(v, OP_Rea
e510: 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  l, 0, iMem, 0, z
e520: 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20  V, P4_REAL);.   
e530: 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
e540: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
e550: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
e560: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
e570: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
e580: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
e590: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
e5a0: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
e5b0: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
e5c0: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
e5d0: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
e5e0: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
e5f0: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
e600: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
e610: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
e620: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
e630: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
e640: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
e650: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
e660: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
e670: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70  Vdbe *v, Expr *p
e680: 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
e690: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
e6a0: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
e6b0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
e6c0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
e6d0: 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  xpr->u.iValue;. 
e6e0: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
e6f0: 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c   i = -i;.    sql
e700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e710: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
e720: 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b   iMem);.  }else{
e730: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e740: 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  *z = pExpr->u.zT
e750: 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  oken;.    assert
e760: 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( z!=0 );.    if
e770: 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36  ( sqlite3FitsIn6
e780: 34 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67  4Bits(z, negFlag
e790: 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76  ) ){.      i64 v
e7a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72  alue;.      char
e7b0: 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69   *zV;.      sqli
e7c0: 74 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61  te3Atoi64(z, &va
e7d0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
e7e0: 6e 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20  negFlag ) value 
e7f0: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  = -value;.      
e800: 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
e810: 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
e820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e830: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
e840: 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20  Int64, 0, iMem, 
e850: 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29  0, zV, P4_INT64)
e860: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e870: 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a     codeReal(v, z
e880: 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
e890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e8a0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63  *.** Clear a cac
e8b0: 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  he entry..*/.sta
e8c0: 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
e8d0: 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
e8e0: 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79  pParse, struct y
e8f0: 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20  ColCache *p){.  
e900: 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29  if( p->tempReg )
e910: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
e920: 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
e930: 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
e940: 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20  mpReg) ){.      
e950: 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
e960: 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
e970: 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  g++] = p->iReg;.
e980: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d      }.    p->tem
e990: 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pReg = 0;.  }.}.
e9a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
e9b0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
e9c0: 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
e9d0: 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
e9e0: 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
e9f0: 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
ea00: 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
ea10: 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
ea20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
ea30: 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
ea40: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
ea50: 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
ea60: 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
ea70: 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
ea80: 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
ea90: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
eaa0: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52  p;..  assert( iR
eab0: 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69  eg>0 );  /* Regi
eac0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65  ster numbers are
ead0: 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
eae0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43   */.  assert( iC
eaf0: 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
eb00: 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
eb10: 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
eb20: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 72 73 74  s */..  /* First
eb30: 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
eb40: 73 74 69 6e 67 20 65 6e 74 72 79 20 2a 2f 0a 20  sting entry */. 
eb50: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
eb60: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
eb70: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
eb80: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
eb90: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26     if( p->iReg &
eba0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
ebb0: 62 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  b && p->iColumn=
ebc0: 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 63  =iCol ){.      c
ebd0: 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
ebe0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
ebf0: 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
ec00: 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
ec10: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
ec20: 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
ec30: 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a  >affChange = 0;.
ec40: 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
ec50: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
ec60: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
ec70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ec80: 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
ec90: 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
eca0: 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
ecb0: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
ecc0: 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
ecd0: 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
ece0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
ecf0: 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
ed00: 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
ed10: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
ed20: 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
ed30: 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
ed40: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
ed50: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
ed60: 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
ed70: 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20   p->affChange = 
ed80: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  0;.      p->temp
ed90: 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Reg = 0;.      p
eda0: 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
edb0: 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
edc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
edd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  .  }..  /* Repla
ede0: 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65  ce the last rece
edf0: 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d  ntly used */.  m
ee00: 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66  inLru = 0x7fffff
ee10: 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d  ff;.  idxLru = -
ee20: 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  1;.  for(i=0, p=
ee30: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
ee40: 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
ee50: 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
ee60: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72  ){.    if( p->lr
ee70: 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20  u<minLru ){.    
ee80: 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20    idxLru = i;.  
ee90: 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e      minLru = p->
eea0: 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lru;.    }.  }. 
eeb0: 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c   if( ALWAYS(idxL
eec0: 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20  ru>=0) ){.    p 
eed0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
eee0: 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20  ache[idxLru];.  
eef0: 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50    p->iLevel = pP
ef00: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
ef10: 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  l;.    p->iTable
ef20: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e   = iTab;.    p->
ef30: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a  iColumn = iCol;.
ef40: 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
ef50: 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68  eg;.    p->affCh
ef60: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  ange = 0;.    p-
ef70: 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
ef80: 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
ef90: 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
efa0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
efb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
efc0: 65 20 74 68 61 74 20 61 20 72 65 67 69 73 74 65  e that a registe
efd0: 72 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 77  r is being overw
efe0: 72 69 74 74 65 6e 2e 20 20 50 75 72 67 65 20 74  ritten.  Purge t
eff0: 68 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66  he register.** f
f000: 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
f010: 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ache..*/.void sq
f020: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
f030: 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  move(Parse *pPar
f040: 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
f050: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
f060: 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
f070: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
f080: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
f090: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
f0a0: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
f0b0: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
f0c0: 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
f0d0: 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
f0e0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
f0f0: 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
f100: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
f110: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
f120: 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
f130: 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
f140: 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
f150: 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
f160: 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
f170: 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
f180: 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
f190: 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
f1a0: 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
f1b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f1c0: 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
f1d0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f1e0: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
f1f0: 76 65 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  vel++;.}../*.** 
f200: 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20  Remove from the 
f210: 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79  column cache any
f220: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65   entries that we
f230: 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74  re added since t
f240: 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  he.** the previo
f250: 75 73 20 4e 20 50 75 73 68 20 6f 70 65 72 61 74  us N Push operat
f260: 69 6f 6e 73 2e 20 20 49 6e 20 6f 74 68 65 72 20  ions.  In other 
f270: 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 20 74  words, restore t
f280: 68 65 20 63 61 63 68 65 0a 2a 2a 20 74 6f 20 74  he cache.** to t
f290: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
f2a0: 69 6e 20 4e 20 50 75 73 68 65 73 20 61 67 6f 2e  in N Pushes ago.
f2b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f2c0: 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
f2d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f2e0: 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  N){.  int i;.  s
f2f0: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
f300: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  *p;.  assert( N>
f310: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f320: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
f330: 65 6c 3e 3d 4e 20 29 3b 0a 20 20 70 50 61 72 73  el>=N );.  pPars
f340: 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 2d  e->iCacheLevel -
f350: 3d 20 4e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = N;.  for(i=0, 
f360: 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
f370: 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
f380: 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
f390: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
f3a0: 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65  iReg && p->iLeve
f3b0: 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  l>pParse->iCache
f3c0: 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63  Level ){.      c
f3d0: 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
f3e0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
f3f0: 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20   p->iReg = 0;.  
f400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f410: 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20 63   When a cached c
f420: 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64 2c  olumn is reused,
f430: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f440: 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73 0a  its register is.
f450: 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61  ** no longer ava
f460: 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d 70  ilable as a temp
f470: 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63 6b   register.  tick
f480: 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74 20  et #3879:  that 
f490: 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65 72  same.** register
f4a0: 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68 65   might be in the
f4b0: 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69 70   cache in multip
f4c0: 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62 65  le places, so be
f4d0: 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20   sure to.** get 
f4e0: 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  them all..*/.sta
f4f0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
f500: 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69  ExprCachePinRegi
f510: 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  ster(Parse *pPar
f520: 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
f530: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
f540: 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
f550: 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
f560: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
f570: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
f580: 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
f590: 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
f5a0: 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70 2d  iReg ){.      p-
f5b0: 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
f5c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f5d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
f5e0: 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
f5f0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
f600: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74  column from.** t
f610: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74  able pTab and st
f620: 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  ore the column v
f630: 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74  alue in a regist
f640: 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a  er.  An effort.*
f650: 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f  * is made to sto
f660: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
f670: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
f680: 69 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69  iReg, but this i
f690: 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74  s.** not guarant
f6a0: 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69  eed.  The locati
f6b0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  on of the column
f6c0: 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
f6d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ed..**.** There 
f6e0: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
f6f0: 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
f700: 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68  n iTable when th
f710: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
f720: 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f   called.  If iCo
f730: 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65  lumn<0 then code
f740: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68   is generated th
f750: 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20  at extracts the 
f760: 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rowid..**.** Thi
f770: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
f780: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65  attempt to reuse
f790: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
f7a0: 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a  e column that.**
f7b0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
f7c0: 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20  n loaded into a 
f7d0: 72 65 67 69 73 74 65 72 2e 20 20 54 68 65 20 76  register.  The v
f7e0: 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  alue will always
f7f0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 69  .** be used if i
f800: 74 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67  t has not underg
f810: 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79  one any affinity
f820: 20 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69   changes.  But i
f830: 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79  f.** an affinity
f840: 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
f850: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  rred, then the c
f860: 61 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  ached value will
f870: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64   only be.** used
f880: 20 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67   if allowAffChng
f890: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74   is true..*/.int
f8a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f8b0: 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  GetColumn(.  Par
f8c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
f8d0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
f8e0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
f8f0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
f900: 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
f910: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f920: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
f930: 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
f940: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
f950: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
f960: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
f970: 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
f980: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
f990: 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
f9a0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
f9b0: 20 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a   iReg,        /*
f9c0: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
f9d0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c  ere */.  int all
f9e0: 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75  owAffChng /* Tru
f9f0: 65 20 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e  e if prior affin
fa00: 69 74 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  ity changes are 
fa10: 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  OK */.){.  Vdbe 
fa20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
fa30: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
fa40: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
fa50: 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
fa60: 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
fa70: 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
fa80: 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
fa90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
faa0: 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
fab0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
fac0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
fad0: 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  mn.           &&
fae0: 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20   (!p->affChange 
faf0: 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29  || allowAffChng)
fb00: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   ){.      p->lru
fb10: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
fb20: 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  eCnt++;.      sq
fb30: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
fb40: 6e 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65  nRegister(pParse
fb50: 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20  , p->iReg);.    
fb60: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67    return p->iReg
fb70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20  ;.    }.  }  .  
fb80: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
fb90: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
fba0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
fbb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fbc0: 6f 77 69 64 2c 20 69 54 61 62 6c 65 2c 20 69 52  owid, iTable, iR
fbd0: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
fbe0: 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29   ALWAYS(pTab!=0)
fbf0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
fc00: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
fc10: 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
fc20: 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73  OP_Column;.    s
fc30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fc40: 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
fc50: 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
fc60: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
fc70: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
fc80: 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e  , iColumn);.#ifn
fc90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fca0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
fcb0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
fcc0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
fcd0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
fce0: 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71  REAL ){.      sq
fcf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fd00: 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  v, OP_RealAffini
fd10: 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ty, iReg);.    }
fd20: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
fd30: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
fd40: 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
fd50: 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
fd60: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  g);.  return iRe
fd70: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  g;.}../*.** Clea
fd80: 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63  r all column cac
fd90: 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76  he entries..*/.v
fda0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
fdb0: 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20  acheClear(Parse 
fdc0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
fdd0: 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
fde0: 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
fdf0: 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
fe00: 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
fe10: 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
fe20: 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
fe30: 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
fe40: 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
fe50: 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
fe60: 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
fe70: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
fe80: 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
fe90: 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
fea0: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
feb0: 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
fec0: 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
fed0: 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
fee0: 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
fef0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ff00: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
ff10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
ff20: 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
ff30: 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69 45 6e  ount){.  int iEn
ff40: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 43 6f  d = iStart + iCo
ff50: 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74 20 69  unt - 1;.  int i
ff60: 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
ff70: 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
ff80: 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
ff90: 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
ffa0: 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
ffb0: 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
ffc0: 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
ffd0: 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72 74 20    if( r>=iStart 
ffe0: 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20  && r<=iEnd ){.  
fff0: 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65      p->affChange
10000 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
10010 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10020 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
10030 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
10040 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
10050 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
10060 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
10070 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
10080 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
10090 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
100a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
100b0 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
100c0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
100d0 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
100e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
100f0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
10100 70 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69  p;.  if( NEVER(i
10110 46 72 6f 6d 3d 3d 69 54 6f 29 20 29 20 72 65 74  From==iTo) ) ret
10120 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
10130 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d  beAddOp3(pParse-
10140 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c  >pVdbe, OP_Move,
10150 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65   iFrom, iTo, nRe
10160 67 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  g);.  for(i=0, p
10170 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
10180 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
10190 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
101a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  +){.    int x = 
101b0 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
101c0 20 78 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69   x>=iFrom && x<i
101d0 46 72 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20  From+nReg ){.   
101e0 20 20 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54     p->iReg += iT
101f0 6f 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20  o-iFrom;.    }. 
10200 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10210 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70  rate code to cop
10220 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  y content from r
10230 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
10240 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
10250 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
10260 6f 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69  o+nReg-1..*/.voi
10270 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
10280 65 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61  eCopy(Parse *pPa
10290 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
102a0 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
102b0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
102c0 66 28 20 4e 45 56 45 52 28 69 46 72 6f 6d 3d 3d  f( NEVER(iFrom==
102d0 69 54 6f 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  iTo) ) return;. 
102e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67   for(i=0; i<nReg
102f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
10300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
10310 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
10320 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69  Copy, iFrom+i, i
10330 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  To+i);.  }.}../*
10340 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
10350 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
10360 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
10370 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
10380 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
10390 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
103a0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73  lumn cache..*/.s
103b0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
103c0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
103d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
103e0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
103f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
10400 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
10410 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
10420 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
10430 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
10440 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
10450 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
10460 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
10470 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
10480 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
10490 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
104a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74  *.** If the last
104b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64   instruction cod
104c0 65 64 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72  ed is an ephemer
104d0 61 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f  al copy of any o
104e0 66 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  f.** the registe
104f0 72 73 20 69 6e 20 74 68 65 20 6e 52 65 67 20 72  rs in the nReg r
10500 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
10510 6e 67 20 77 69 74 68 20 69 52 65 67 2c 20 74 68  ng with iReg, th
10520 65 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68  en.** convert th
10530 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69  e last instructi
10540 6f 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79  on from OP_SCopy
10550 20 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a   to OP_Copy..*/.
10560 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
10570 48 61 72 64 43 6f 70 79 28 50 61 72 73 65 20 2a  HardCopy(Parse *
10580 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
10590 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 56  , int nReg){.  V
105a0 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  dbeOp *pOp;.  Vd
105b0 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
105c0 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
105d0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
105e0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
105f0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
10600 76 21 3d 30 20 29 3b 0a 20 20 70 4f 70 20 3d 20  v!=0 );.  pOp = 
10610 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
10620 28 76 2c 20 2d 31 29 3b 0a 20 20 61 73 73 65 72  (v, -1);.  asser
10630 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 69  t( pOp!=0 );.  i
10640 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
10650 4f 50 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d  OP_SCopy && pOp-
10660 3e 70 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70  >p1>=iReg && pOp
10670 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29  ->p1<iReg+nReg )
10680 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  {.    pOp->opcod
10690 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d  e = OP_Copy;.  }
106a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
106b0 74 65 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65  te code to store
106c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
106d0 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61  e iAlias-th alia
106e0 73 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a  s in register.**
106f0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 66 69   target.  The fi
10700 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
10710 20 63 61 6c 6c 65 64 2c 20 70 45 78 70 72 20 69   called, pExpr i
10720 73 20 65 76 61 6c 75 61 74 65 64 20 74 6f 20 63  s evaluated to c
10730 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 76 61  ompute.** the va
10740 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 69 61 73  lue of the alias
10750 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
10760 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 75 78  stored in an aux
10770 69 6c 69 61 72 79 20 72 65 67 69 73 74 65 72 0a  iliary register.
10780 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ** and the numbe
10790 72 20 6f 66 20 74 68 61 74 20 72 65 67 69 73 74  r of that regist
107a0 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  er is returned. 
107b0 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63   On subsequent c
107c0 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72 65 67  alls,.** the reg
107d0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 69 73 20  ister number is 
107e0 72 65 74 75 72 6e 65 64 20 77 69 74 68 6f 75 74  returned without
107f0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 79 20   generating any 
10800 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  code..**.** Note
10810 20 74 68 61 74 20 69 6e 20 6f 72 64 65 72 20 66   that in order f
10820 6f 72 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 2c  or this to work,
10830 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 67 65   code must be ge
10840 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 0a 2a  nerated in the.*
10850 2a 20 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61  * same order tha
10860 74 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  t it is executed
10870 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65 73 20  ..**.** Aliases 
10880 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
10890 72 74 69 6e 67 20 77 69 74 68 20 31 2e 20 20 53  rting with 1.  S
108a0 6f 20 69 41 6c 69 61 73 20 69 73 20 69 6e 20 74  o iAlias is in t
108b0 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20 31  he range.** of 1
108c0 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69   to pParse->nAli
108d0 61 73 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 0a  as inclusive.  .
108e0 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 61 41  **.** pParse->aA
108f0 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 72  lias[iAlias-1] r
10900 65 63 6f 72 64 73 20 74 68 65 20 72 65 67 69 73  ecords the regis
10910 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
10920 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
10930 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61   the iAlias-th a
10940 6c 69 61 73 20 69 73 20 73 74 6f 72 65 64 2e 20  lias is stored. 
10950 20 49 66 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d   If zero, that m
10960 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  eans that the.**
10970 20 61 6c 69 61 73 20 68 61 73 20 6e 6f 74 20 79   alias has not y
10980 65 74 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  et been computed
10990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
109a0 63 6f 64 65 41 6c 69 61 73 28 50 61 72 73 65 20  codeAlias(Parse 
109b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 41 6c  *pParse, int iAl
109c0 69 61 73 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ias, Expr *pExpr
109d0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 23  , int target){.#
109e0 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33 20 2a  if 0.  sqlite3 *
109f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10a00 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 69  .  int iReg;.  i
10a10 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  f( pParse->nAlia
10a20 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d 3e 6e  sAlloc<pParse->n
10a30 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 50 61  Alias ){.    pPa
10a40 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20 73 71  rse->aAlias = sq
10a50 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
10a60 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d  Free(db, pParse-
10a70 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >aAlias,.       
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
10aa0 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b  (pParse->aAlias[
10ab0 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69  0])*pParse->nAli
10ac0 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  as );.    testca
10ad0 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
10ae0 69 6c 65 64 20 26 26 20 70 50 61 72 73 65 2d 3e  iled && pParse->
10af0 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20 29 3b  nAliasAlloc>0 );
10b00 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
10b10 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10b20 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74  rn 0;.    memset
10b30 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  (&pParse->aAlias
10b40 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41  [pParse->nAliasA
10b50 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20 20 20  lloc], 0,.      
10b60 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e 6e 41       (pParse->nA
10b70 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e 41 6c  lias-pParse->nAl
10b80 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66  iasAlloc)*sizeof
10b90 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b  (pParse->aAlias[
10ba0 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65  0]));.    pParse
10bb0 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20 3d 20  ->nAliasAlloc = 
10bc0 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a  pParse->nAlias;.
10bd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 41    }.  assert( iA
10be0 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69 61 73  lias>0 && iAlias
10bf0 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  <=pParse->nAlias
10c00 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70 50 61   );.  iReg = pPa
10c10 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69  rse->aAlias[iAli
10c20 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69 52 65  as-1];.  if( iRe
10c30 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  g==0 ){.    if( 
10c40 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
10c50 76 65 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  vel>0 ){.      i
10c60 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
10c70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
10c80 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
10c90 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
10ca0 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50       iReg = ++pP
10cb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
10cc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10cd0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
10ce0 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50   iReg);.      pP
10cf0 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c  arse->aAlias[iAl
10d00 69 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20  ias-1] = iReg;. 
10d10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10d20 6e 20 69 52 65 67 3b 0a 23 65 6c 73 65 0a 20 20  n iReg;.#else.  
10d30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10d40 28 69 41 6c 69 61 73 29 3b 0a 20 20 72 65 74 75  (iAlias);.  retu
10d50 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
10d60 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
10d70 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
10d80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
10d90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
10da0 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
10db0 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
10dc0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
10dd0 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
10de0 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
10df0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
10e00 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
10e10 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
10e20 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
10e30 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
10e40 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
10e50 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
10e60 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
10e70 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
10e80 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
10e90 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
10ea0 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
10eb0 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
10ec0 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
10ed0 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
10ee0 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
10ef0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
10f00 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
10f10 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
10f20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
10f30 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
10f40 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
10f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10f60 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
10f70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
10f80 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
10f90 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
10fa0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10fb0 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
10fc0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
10fd0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ff0 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
11000 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
11010 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
11020 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11030 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
11040 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
11050 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
11060 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
11070 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
11080 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
11090 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
110a0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
110b0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
110c0 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
110d0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
110e0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
110f0 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
11100 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
11110 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
11120 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11130 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
11140 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11150 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  ection */..  ass
11160 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
11170 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
11180 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76  >nMem );.  if( v
11190 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
111a0 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
111b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
111c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
111d0 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
111e0 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
111f0 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
11200 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
11210 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
11220 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
11230 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
11240 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
11250 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
11260 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
11270 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
11280 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
11290 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
112a0 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
112b0 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
112c0 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
112d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
112e0 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
112f0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43        inReg = pC
11300 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
11310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
11320 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
11330 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
11340 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11350 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11360 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
11370 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
11380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
113b0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
113c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
113d0 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
113e0 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
113f0 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
11400 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
11410 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11420 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
11430 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
11440 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
11450 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
11460 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
11470 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
11480 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
11490 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 42  ert( pParse->ckB
114a0 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ase>0 );.       
114b0 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
114c0 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
114d0 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
114e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
114f0 65 73 74 63 61 73 65 28 20 28 70 45 78 70 72 2d  estcase( (pExpr-
11500 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
11510 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ff)!=0 );.      
11520 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
11530 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
11540 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
11550 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
11580 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  iColumn, pExpr->
11590 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a  iTable, target,.
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
115d0 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20 20  EP_AnyAff);.    
115e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
115f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11600 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
11610 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
11620 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72  v, pExpr, 0, tar
11630 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
11640 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11650 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
11660 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
11670 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
11680 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
11690 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65   );.      codeRe
116a0 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  al(v, pExpr->u.z
116b0 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74  Token, 0, target
116c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
116d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
116e0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
116f0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
11700 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
11710 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
11720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11730 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11740 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
11750 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
11760 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
11770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11780 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
11790 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
117a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
117b0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
117c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
117d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
117e0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
117f0 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
11800 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
11810 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
11820 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
11830 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
11840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11850 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11860 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
11870 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
11880 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
11890 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
118a0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
118b0 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
118c0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
118d0 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
118e0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
118f0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
11900 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
11910 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
11920 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
11930 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
11940 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
11950 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
11960 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
11970 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
11980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11990 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
119a0 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
119b0 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
119c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
119d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
119e0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
119f0 20 7b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20   {.      VdbeOp 
11a00 2a 70 4f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  *pOp;.      asse
11a10 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
11a20 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
11a30 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
11a40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11a50 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a  >u.zToken!=0 );.
11a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
11a70 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
11a80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
11a90 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
11aa0 5b 31 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  [1]==0.         
11ab0 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69 74 65  && (pOp = sqlite
11ac0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
11ad0 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  ))->opcode==OP_V
11ae0 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 20 20  ariable.        
11af0 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d   && pOp->p1+pOp-
11b00 3e 70 33 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  >p3==pExpr->iTab
11b10 6c 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  le.         && p
11b20 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3d 3d  Op->p2+pOp->p3==
11b30 74 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  target.         
11b40 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 0a  && pOp->p4.z==0.
11b50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
11b60 20 2f 2a 20 49 66 20 74 68 65 20 70 72 65 76 69   /* If the previ
11b70 6f 75 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ous instruction 
11b80 77 61 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  was a copy of th
11b90 65 20 70 72 65 76 69 6f 75 73 20 75 6e 6e 61 6d  e previous unnam
11ba0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ed.        ** pa
11bb0 72 61 6d 65 74 65 72 20 69 6e 74 6f 20 74 68 65  rameter into the
11bc0 20 70 72 65 76 69 6f 75 73 20 72 65 67 69 73 74   previous regist
11bd0 65 72 2c 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  er, then simply 
11be0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 20 20  increment the.  
11bf0 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20        ** repeat 
11c00 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 70 72 69  count on the pri
11c10 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  or instruction r
11c20 61 74 68 65 72 20 74 68 61 6e 20 6d 61 6b 69 6e  ather than makin
11c30 67 20 61 20 6e 65 77 0a 20 20 20 20 20 20 20 20  g a new.        
11c40 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
11c50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11c60 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
11c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c90 64 4f 70 33 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp3(v, OP_Varia
11ca0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ble, pExpr->iTab
11cb0 6c 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  le, target, 1);.
11cc0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
11cd0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
11ce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
11cf0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11d00 50 34 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d  P4(v, -1, pExpr-
11d10 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20  >u.zToken, 0);. 
11d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11d30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11d50 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
11d60 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
11d70 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
11d80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11d90 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
11da0 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f 64 65      inReg = code
11db0 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
11dc0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
11dd0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
11de0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
11df0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
11e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
11e10 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
11e20 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
11e30 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
11e40 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
11e50 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
11e60 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74        int aff, t
11e70 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 52 65  o_op;.      inRe
11e80 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
11e90 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
11ea0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11eb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 61  target);.      a
11ec0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11ed0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
11ee0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
11ef0 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
11f00 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
11f10 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
11f20 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61  .      to_op = a
11f30 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff - SQLITE_AFF_
11f40 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74  TEXT + OP_ToText
11f50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11f60 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
11f70 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
11f80 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
11f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11fa0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
11fb0 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
11fc0 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29  TE_AFF_NONE    )
11fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11fe0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
11ff0 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49  ric || aff!=SQLI
12000 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
12010 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12020 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
12030 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
12040 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
12050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12060 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
12070 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
12080 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
12090 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
120a0 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65  ( to_op==OP_ToTe
120b0 78 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  xt );.      test
120c0 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
120d0 54 6f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  ToBlob );.      
120e0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
120f0 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b  =OP_ToNumeric );
12100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12110 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
12120 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12130 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
12140 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Real );.      if
12150 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
12160 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12180 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
12190 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
121a0 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74    inReg = target
121b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
121c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
121d0 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65  1(v, to_op, inRe
121e0 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  g);.      testca
121f0 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
12200 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
12210 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
12220 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12230 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
12240 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
12250 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
12260 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12270 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12280 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
12290 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
122a0 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
122b0 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
122c0 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
122d0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
122e0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
122f0 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
12300 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
12310 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
12320 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
12330 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
12340 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12350 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
12360 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12370 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
12380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12390 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
123a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
123b0 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
123c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
123d0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
123e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
123f0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
12400 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
12410 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12420 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
12430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12440 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
12450 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
12460 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45  rands(pParse, pE
12470 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c  xpr->pLeft, &r1,
12480 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
124b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32  xpr->pRight, &r2
124c0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
124d0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
124e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
124f0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
12500 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
12510 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
12520 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
12530 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
12540 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
12550 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
12560 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
12570 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
12580 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12590 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
125a0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
125b0 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
125c0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
125d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
125e0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
125f0 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
12600 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
12610 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
12620 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
12630 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
12640 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
12650 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
12660 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
12670 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
12680 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
12690 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
126a0 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
126b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
126c0 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
126d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
126e0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
126f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12700 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
12710 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
12720 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
12730 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
12740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12750 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
12760 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12770 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
12780 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
12790 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
127a0 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
127b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
127c0 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
127d0 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
127e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
127f0 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
12800 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12810 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
12820 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12830 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20  op==TK_OR );.   
12840 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12850 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
12860 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12870 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20  TK_MINUS );.    
12880 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12890 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
128a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
128b0 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
128c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
128d0 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
128e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
128f0 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20  K_SLASH );.     
12900 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
12910 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
12920 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12930 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
12940 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12950 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20  =TK_CONCAT );.  
12960 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
12970 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12980 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12990 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
129a0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
129b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
129c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
129d0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
129e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
129f0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
12a00 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
12a10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12a20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
12a30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12a40 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
12a50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12a60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
12a70 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
12a80 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
12a90 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
12aa0 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
12ab0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
12ac0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
12ad0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12ae0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
12af0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
12b00 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
12b10 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
12b20 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
12b30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
12b40 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
12b50 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
12b60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
12b70 49 6e 74 65 67 65 72 28 76 2c 20 70 4c 65 66 74  Integer(v, pLeft
12b80 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
12b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ba0 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 72 31     regFree1 = r1
12bb0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12bc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
12bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12be0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12bf0 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b 0a 20  teger, 0, r1);. 
12c00 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
12c10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
12c20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12c30 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29  Left, &regFree2)
12c40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12c50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12c60 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20  P_Subtract, r2, 
12c70 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
12c80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12c90 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
12ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
12cb0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
12cc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12cd0 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
12ce0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
12cf0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
12d00 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
12d10 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
12d20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
12d30 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
12d40 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12d50 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20  TK_BITNOT );.   
12d60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12d70 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_NOT );.     
12d80 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
12d90 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12da0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12db0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
12dc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
12dd0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
12de0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
12df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12e00 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
12e10 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20  r1, inReg);.    
12e20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
12e30 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
12e40 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
12e50 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
12e60 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
12e70 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
12e80 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
12e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12ea0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
12eb0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74 65  Null );.      te
12ec0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
12ed0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
12ee0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
12ef0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
12f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f10 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12f20 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
12f30 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
12f40 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12f50 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12f60 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
12f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12f80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
12f90 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
12fa0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12fb0 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  op, r1);.      s
12fc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12fd0 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
12fe0 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  arget, -1);.    
12ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13000 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
13010 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13020 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13030 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
13040 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
13050 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
13060 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
13070 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
13080 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
13090 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
130a0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
130b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
130c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
130d0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
130e0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
130f0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
13100 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
13110 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
13120 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
13130 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
13140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13150 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13160 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
13170 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
13180 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
13190 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72    ExprList *pFar
131a0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  g;       /* List
131b0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
131c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
131d0 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20  int nFarg;      
131e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
131f0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
13200 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
13210 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
13220 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
13230 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
13240 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
13250 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
13260 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
13270 74 68 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  th of the functi
13280 6f 6e 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  on name in bytes
13290 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
132a0 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
132b0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
132c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 69   name */.      i
132d0 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
132e0 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
132f0 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
13300 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
13310 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
13320 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
13330 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
13340 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
13350 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
13360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
13370 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
13380 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
13390 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
133a0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
133b0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
133c0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
133d0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
133e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
133f0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
13400 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13410 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54  se( op==TK_CONST
13420 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74  _FUNC );.      t
13430 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13440 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
13450 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
13460 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
13470 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
13480 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
13490 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
134a0 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
134b0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
134c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
134d0 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
134e0 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
134f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
13500 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13510 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
13520 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
13530 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
13540 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
13550 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13560 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
13570 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
13580 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
13590 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  nId, nFarg, enc,
135a0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
135b0 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
135c0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
135d0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
135e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
135f0 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
13600 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13610 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
13620 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c  t(pParse, pFarg,
13630 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d   r1, 1);.      }
13640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
13650 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69   = 0;.      }.#i
13660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13670 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13680 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
13690 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
136a0 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
136b0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
136c0 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
136d0 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
136e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
136f0 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
13700 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
13710 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
13720 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
13730 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
13740 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
13750 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
13760 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
13770 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
13780 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
13790 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
137a0 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
137b0 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
137c0 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
137d0 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
137e0 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
137f0 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
13800 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
13810 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
13820 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
13830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13840 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
13850 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
13860 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
13870 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
13880 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
13890 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
138a0 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
138b0 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
138c0 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
138d0 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
138e0 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
138f0 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
13900 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
13910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13920 66 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28  f( nFarg>=2 && (
13930 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
13940 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
13950 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
13960 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
13970 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
13980 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72  Def, nFarg, pFar
13990 67 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  g->a[1].pExpr);.
139a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
139b0 6e 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20  nFarg>0 ){.     
139c0 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
139d0 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
139e0 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
139f0 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
13a00 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
13a10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67  for(i=0; i<nFarg
13a30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13a40 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69  if( i<32 && sqli
13a50 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
13a60 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  t(pFarg->a[i].pE
13a70 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
13a80 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28    constMask |= (
13a90 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
13aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
13ab0 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
13ac0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
13ad0 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29  )!=0 && !pColl )
13ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
13af0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13b00 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13b10 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
13b20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13b30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
13b40 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
13b50 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
13b60 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
13b70 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
13b80 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13b90 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
13ba0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13bb0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
13bc0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
13bd0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
13be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13c00 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
13c10 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
13c20 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13c40 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
13c50 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
13c60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13c70 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
13c80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
13c90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
13ca0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13cb0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
13cc0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
13cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13ce0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
13cf0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
13d00 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
13d10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
13d20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d30 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
13d40 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
13d50 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
13d60 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
13d70 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
13d80 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
13d90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
13da0 43 54 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  CT );.      sqli
13db0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
13dc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
13dd0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 52  0, 0);.      inR
13de0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
13df0 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  umn;.      break
13e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13e10 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
13e20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20  int rNotFound = 
13e30 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61  0;.      int rMa
13e40 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
13e50 20 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c       int j2, j3,
13e60 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63   j4, j5;.      c
13e70 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
13e80 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a      int eType;..
13e90 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
13ea0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
13eb0 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74   IN expr r%d", t
13ec0 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65  arget));.      e
13ed0 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
13ee0 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
13ef0 2c 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61  , pExpr, &rMayHa
13f00 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69  veNull);.      i
13f10 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  f( rMayHaveNull 
13f20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46  ){.        rNotF
13f30 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ound = ++pParse-
13f40 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a  >nMem;.      }..
13f50 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
13f60 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
13f70 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
13f80 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
13f90 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
13fa0 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
13fb0 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
13fc0 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
13fd0 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
13fe0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34   for.      ** P4
13ff0 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
14000 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14010 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
14020 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
14030 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20  pExpr);...      
14040 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
14050 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
14060 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
14070 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
14080 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
14090 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
140a0 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
140b0 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
140c0 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
140d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
140e0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
140f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14100 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14110 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
14120 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32  arget);.      j2
14130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14140 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
14150 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  l, target);.    
14160 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
14170 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
14180 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69         j3 = sqli
14190 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
141a0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74   OP_MustBeInt, t
141b0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
141c0 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
141d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
141e0 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69  Exists, pExpr->i
141f0 54 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65 74  Table, 0, target
14200 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14220 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
14230 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
14240 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
14250 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
14260 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
14270 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14280 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20 20  v, j3);.        
14290 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
142a0 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20  ere(v, j4);.    
142b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
142c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
142d0 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ger, 0, target);
142e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
142f0 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46 72        r2 = regFr
14300 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ee2 = sqlite3Get
14310 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14320 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65  ..        /* Cre
14330 61 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e 64  ate a record and
14340 20 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d 65   test for set me
14350 6d 62 65 72 73 68 69 70 2e 20 49 66 20 74 68 65  mbership. If the
14360 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20   set contains.  
14370 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
14380 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ue, then jump to
14390 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
143a0 74 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20 74  test code. The t
143b0 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  arget.        **
143c0 20 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c 20   register still 
143d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72 75  contains the tru
143e0 65 20 28 31 29 20 76 61 6c 75 65 20 77 72 69 74  e (1) value writ
143f0 74 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69 65  ten to it earlie
14400 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
14410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14420 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
14430 6b 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65 74  keRecord, target
14440 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
14450 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
14460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14470 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14480 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
14490 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
144a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
144b0 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
144c0 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a  iTable, 0, r2);.
144d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
144e0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
144f0 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
14500 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
14510 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
14520 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
14530 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
14540 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
14550 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
14560 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
14570 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
14580 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
14590 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
145a0 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  et .        ** c
145b0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
145c0 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
145d0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
145e0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
145f0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ** expression is
14600 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20   also NULL..    
14610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
14620 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20  f( rNotFound==0 
14630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14640 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
14650 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20   if it is known 
14660 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
14670 28 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20 20  (now) that .    
14680 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 74        ** the set
14690 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c   contains no NUL
146a0 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
146b0 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
146c0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 2a  sult.          *
146d0 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c  * of a "NOT NULL
146e0 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20  " constraint in 
146f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
14700 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20  ema. No need.   
14710 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
14720 74 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  t the data struc
14730 74 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65 20  ture at runtime 
14740 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
14750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14770 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14780 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
14790 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
147a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
147b0 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74  is block populat
147c0 65 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64  es the rNotFound
147d0 20 72 65 67 69 73 74 65 72 20 77 69 74 68 20 65   register with e
147e0 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20  ither NULL.     
147f0 20 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e       ** or 0 (an
14800 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e   integer value).
14810 20 49 66 20 74 68 65 20 64 61 74 61 20 73 74 72   If the data str
14820 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
14830 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  one.          **
14840 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20   or more NULLs, 
14850 74 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75  then set rNotFou
14860 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65  nd to NULL. Othe
14870 72 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20 20  rwise, set it.  
14880 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e          ** to 0.
14890 20 49 66 20 72 65 67 69 73 74 65 72 20 72 4d 61   If register rMa
148a0 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72  yHaveNull is alr
148b0 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d 65  eady set to some
148c0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
148d0 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 4e   ** other than N
148e0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ULL, then the te
148f0 73 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  st has already b
14900 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20 20  een run and .   
14910 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f         ** rNotFo
14920 75 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 70  und is already p
14930 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20 20  opulated..      
14940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
14950 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
14960 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20  ar nullRecord[] 
14970 3d 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20 7d  = { 0x02, 0x00 }
14980 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20 3d  ;.          j3 =
14990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
149a0 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
149b0 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b  , rMayHaveNull);
149c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
149d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149e0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74  OP_Null, 0, rNot
149f0 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
14a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a10 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op4(v, OP_Blob, 
14a20 32 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  2, rMayHaveNull,
14a30 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34    nullRecord, P4
14a60 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
14a70 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33      j4 = sqlite3
14a80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14a90 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
14aa0 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61  Table, 0, rMayHa
14ab0 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  veNull);.       
14ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14ae0 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64  er, 0, rNotFound
14af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14b00 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14b10 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
14b20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14b30 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a  mpHere(v, j3);..
14b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
14b50 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  y the value of r
14b60 65 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e  egister rNotFoun
14b70 64 20 28 77 68 69 63 68 20 69 73 20 65 69 74 68  d (which is eith
14b80 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20  er NULL or 0).  
14b90 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20          ** into 
14ba0 74 68 65 20 74 61 72 67 65 74 20 72 65 67 69 73  the target regis
14bb0 74 65 72 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ter. This will b
14bc0 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  e the result of 
14bd0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
14be0 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
14bf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14c00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14c10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
14c20 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72  , rNotFound, tar
14c30 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
14c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14c50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14c60 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20  e(v, j2);.      
14c70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14c80 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20  ere(v, j5);.    
14c90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
14ca0 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
14cb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
14cc0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
14cd0 65 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65  expr r%d", targe
14ce0 74 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  t));.      break
14cf0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14d00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
14d10 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
14d20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
14d30 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
14d40 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
14d50 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
14d60 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
14d70 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
14d80 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
14d90 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
14da0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
14db0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
14dc0 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
14dd0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
14de0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
14df0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
14e00 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
14e10 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
14e20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
14e30 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
14e40 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
14e50 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  em = pExpr->x.pL
14e60 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
14e70 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
14e80 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
14e90 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
14ea0 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
14eb0 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
14ec0 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20          pRight, 
14ef0 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
14f00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14f10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
14f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14f30 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14f40 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
14f50 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14f60 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
14f70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14f80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
14f90 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14fa0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
14fb0 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
14fd0 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
14fe0 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
14ff0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
15000 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
15010 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
15020 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15030 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
15040 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
15050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15060 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
15070 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
15080 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15090 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
150a0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
150b0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
150c0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
150d0 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
150e0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
150f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15100 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
15110 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
15120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15130 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15140 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
15150 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15160 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15170 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
15180 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15190 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
151a0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
151b0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
151c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
151d0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
151e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
151f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15200 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
15210 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
15220 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
15230 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
15240 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
15250 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
15260 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
15270 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
15280 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
15290 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
152a0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
152b0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
152c0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
152d0 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
152e0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
152f0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
15300 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
15310 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
15320 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
15330 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
15340 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
15350 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
15360 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
15370 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
15380 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
15390 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
153a0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
153b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
153c0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
153d0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
153e0 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
153f0 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
15400 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
15410 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
15420 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
15430 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
15440 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
15450 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
15460 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
15470 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
15480 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
15490 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
154a0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
154b0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
154c0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
154d0 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
154e0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
154f0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
15500 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
15510 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
15520 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
15530 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
15540 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
15550 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
15560 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
15570 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
155a0 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
155b0 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
155c0 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155e0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
155f0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
15600 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
15610 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
15640 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
15650 20 20 20 20 69 6e 74 20 69 3b 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 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
15680 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
15690 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
156c0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
156d0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
156e0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
156f0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
15700 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
15710 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
15720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15730 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
15740 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
15750 20 20 20 20 20 45 78 70 72 20 63 61 63 68 65 58       Expr cacheX
15760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15770 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64         /* Cached
15780 20 65 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f   expression X */
15790 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      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 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
157c0 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
157d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
157e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
157f0 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
15800 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
15810 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
15820 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
15830 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
15840 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
15850 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
15860 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15870 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15880 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
15890 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
158a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
158b0 28 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ((pExpr->x.pList
158c0 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
158d0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
158e0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
158f0 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
15900 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
15910 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
15920 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
15930 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
15940 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
15950 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
15960 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
15970 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15980 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
15990 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
159a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68   ){.        cach
159b0 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  eX = *pX;.      
159c0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
159d0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
159e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
159f0 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  e( pX->op==TK_RE
15a00 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
15a10 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
15a20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15a30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
15a40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15a50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15a60 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
15a70 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
15a80 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
15a90 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
15aa0 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
15ab0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
15ac0 70 4c 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b  pLeft = &cacheX;
15ad0 0a 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d  .        pTest =
15ae0 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20   &opCompare;.   
15af0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15b00 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
15b10 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
15b20 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
15b30 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
15b40 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
15b50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15b60 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Test!=0 );.     
15b70 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
15b80 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
15b90 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
15ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15bb0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
15bc0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
15bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15be0 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
15bf0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15c00 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
15c10 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
15c20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
15c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15c40 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
15c50 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
15c60 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
15c70 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
15c80 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74   testcase( aList
15c90 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d  elem[i+1].pExpr-
15ca0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
15cb0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
15cc0 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
15cd0 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
15ce0 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
15cf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15d00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
15d10 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
15d20 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
15d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15d40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15d50 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  , 0, endLabel);.
15d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15d70 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
15d80 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  se, 1);.        
15d90 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15da0 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78 74 43  veLabel(v, nextC
15db0 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ase);.      }.  
15dc0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
15dd0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
15de0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15df0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
15e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15e10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15e20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
15e30 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
15e40 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
15e50 6f 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20  op(pParse, 1);. 
15e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15e90 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
15eb0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
15ec0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
15ed0 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
15ee0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
15ef0 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
15f00 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
15f10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15f20 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
15f30 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
15f40 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
15f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
15f60 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
15f70 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
15f80 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
15f90 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
15fa0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15fb0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
15fe0 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
15ff0 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
16000 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
16010 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
16020 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16030 2d 3e 61 66 66 69 6e 69 74 79 21 3d 4f 45 5f 49  ->affinity!=OE_I
16040 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
16050 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
16060 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
16070 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
16080 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16090 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
160a0 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
160b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
160c0 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
160d0 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
160e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
160f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16100 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16110 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
16120 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16130 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
16140 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
16150 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 30 2c 0a  r->affinity, 0,.
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16180 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a  ->u.zToken, 0);.
16190 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
161a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
161b0 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
161c0 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a  == OE_Ignore );.
161d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
161e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
161f0 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20  _ContextPop, 0, 
16200 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0);.         sql
16210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16220 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
16230 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
16240 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20  >ignoreJump);.  
16250 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
16260 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47  nt((v, "raise(IG
16270 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20  NORE)"));.      
16280 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16290 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
162a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
162b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
162c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
162d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
162e0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
162f0 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
16300 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nReg;.}../*.** G
16310 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16320 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
16330 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
16340 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
16350 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
16360 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
16370 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
16380 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
16390 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
163a0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
163b0 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
163c0 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
163d0 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
163e0 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
163f0 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
16400 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
16410 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
16420 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
16430 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
16440 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
16450 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
16460 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
16470 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
16480 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
16490 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  g){.  int r1 = s
164a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
164b0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
164c0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
164d0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
164e0 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
164f0 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
16500 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
16510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
16520 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16530 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
16540 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
16550 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
16560 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16570 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
16580 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
16590 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
165a0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
165b0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
165c0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
165d0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
165e0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
165f0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
16600 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
16610 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
16620 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
16630 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
16640 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
16650 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
16660 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
16670 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
16680 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16690 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
166a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
166b0 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
166c0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
166d0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
166e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
166f0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
16700 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
16710 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
16720 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
16730 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
16740 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
16750 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  get);.  }.  retu
16760 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
16770 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16780 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
16790 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
167a0 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
167b0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
167c0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
167d0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
167e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
167f0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
16800 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
16810 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
16820 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
16830 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
16840 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
16850 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
16860 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
16870 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
16880 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
16890 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
168a0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
168b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
168c0 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
168d0 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
168e0 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
168f0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
16900 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
16910 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
16920 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
16930 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
16940 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
16950 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
16960 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
16970 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
16980 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
16990 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
169a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
169b0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
169c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
169d0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
169e0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
169f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
16a00 20 74 65 72 6d 73 20 74 6f 20 49 4e 53 45 52 54   terms to INSERT
16a10 20 6f 72 20 55 50 44 41 54 45 2e 20 20 41 6e 64   or UPDATE.  And
16a20 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 6f   the only.  ** o
16a30 74 68 65 72 20 70 6c 61 63 65 20 77 68 65 72 65  ther place where
16a40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
16a50 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
16a60 74 6f 20 54 4b 5f 52 45 47 49 53 54 45 52 20 69  to TK_REGISTER i
16a70 73 0a 20 20 2a 2a 20 69 6e 20 57 48 45 52 45 20  s.  ** in WHERE 
16a80 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
16a90 67 2e 20 20 53 6f 20 61 73 20 63 75 72 72 65 6e  g.  So as curren
16aa0 74 6c 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2c  tly implemented,
16ab0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6e   there is.  ** n
16ac0 6f 20 77 61 79 20 66 6f 72 20 61 20 54 4b 5f 52  o way for a TK_R
16ad0 45 47 49 53 54 45 52 20 74 6f 20 65 78 69 73 74  EGISTER to exist
16ae0 20 68 65 72 65 2e 20 20 42 75 74 20 69 74 20 73   here.  But it s
16af0 65 65 6d 73 20 70 72 75 64 65 6e 74 20 74 6f 0a  eems prudent to.
16b00 20 20 2a 2a 20 6b 65 65 70 20 74 68 65 20 41 4c    ** keep the AL
16b10 57 41 59 53 28 29 20 69 6e 20 63 61 73 65 20 74  WAYS() in case t
16b20 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
16b30 6f 76 65 20 63 68 61 6e 67 65 20 77 69 74 68 20  ove change with 
16b40 66 75 74 75 72 65 0a 20 20 2a 2a 20 6d 6f 64 69  future.  ** modi
16b50 66 69 63 61 74 69 6f 6e 73 20 6f 72 20 65 6e 68  fications or enh
16b60 61 6e 63 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  ancements. */.  
16b70 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
16b80 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45  ->op!=TK_REGISTE
16b90 52 29 20 29 7b 20 20 0a 20 20 20 20 69 6e 74 20  R) ){  .    int 
16ba0 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d  iMem;.    iMem =
16bb0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
16be0 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b  y, inReg, iMem);
16bf0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
16c00 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70  le = iMem;.    p
16c10 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  Expr->op = TK_RE
16c20 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65  GISTER;.  }.  re
16c30 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
16c40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16c50 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e 20   if pExpr is an 
16c60 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
16c70 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72  ion that is appr
16c80 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20 66  opriate.** for f
16c90 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20  actoring out of 
16ca0 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70 72  a loop.  Appropr
16cb0 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  iate expressions
16cc0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a   are:.**.**    *
16cd0 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
16ce0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
16cf0 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  to two or more o
16d00 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pcodes..**.**   
16d10 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65 67   *  Any OP_Integ
16d20 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50 5f  er, OP_Real, OP_
16d30 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62 2c  String, OP_Blob,
16d40 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20 20   OP_Null, .**   
16d50 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61 62      or OP_Variab
16d60 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
16d70 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63   need to be plac
16d80 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ed in a .**     
16d90 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69 73    specific regis
16da0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ter..**.** There
16db0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
16dc0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73 69  factoring out si
16dd0 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e  ngle-instruction
16de0 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
16df0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e 65  ressions that ne
16e00 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20  ed to be placed 
16e10 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  in a particular 
16e20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20 57  register.  .** W
16e30 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20 74  e could factor t
16e40 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68 65  hem out, but the
16e50 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20 75  n we would end u
16e60 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20 4f  p adding an.** O
16e70 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63 74  P_SCopy instruct
16e80 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ion to move the 
16e90 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 63  value into the c
16ea0 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72 0a  orrect register.
16eb0 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d 69  ** later.  We mi
16ec0 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73 74  ght as well just
16ed0 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   use the origina
16ee0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  l instruction an
16ef0 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 4f  d.** avoid the O
16f00 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61 74  P_SCopy..*/.stat
16f10 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70 72  ic int isAppropr
16f20 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e 67  iateForFactoring
16f30 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
16f40 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
16f50 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
16f60 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16f70 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e 73  0;  /* Only cons
16f80 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  tant expressions
16f90 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
16fa0 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 2a   for factoring *
16fb0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
16fc0 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65 64  flags & EP_Fixed
16fd0 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Dest)==0 ){.    
16fe0 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6e  return 1;  /* An
16ff0 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68 6f  y constant witho
17000 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74 69  ut a fixed desti
17010 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f 70  nation is approp
17020 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20 77  riate */.  }.  w
17030 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
17040 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e 70  UPLUS ) p = p->p
17050 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Left;.  switch( 
17060 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65 66  p->op ){.#ifndef
17070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
17080 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
17090 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e 64  se TK_BLOB:.#end
170a0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
170b0 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73  ARIABLE:.    cas
170c0 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
170d0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
170e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
170f0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
17100 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 74  TRING: {.      t
17110 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17120 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TK_BLOB );.     
17130 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
17140 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 3b  ==TK_VARIABLE );
17150 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17160 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47   p->op==TK_INTEG
17170 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ER );.      test
17180 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
17190 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 74  FLOAT );.      t
171a0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
171b0 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TK_NULL );.     
171c0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
171d0 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a 20  ==TK_STRING );. 
171e0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d 69       /* Single-i
171f0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
17200 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78 65  ants with a fixe
17210 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 72  d destination ar
17220 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  e.      ** bette
17230 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e 20  r done in-line. 
17240 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74 68   If we factor th
17250 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a 75  em, they will ju
17260 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a 20  st end.      ** 
17270 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  up generating an
17280 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f 76   OP_SCopy to mov
17290 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 74  e the value to t
172a0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
172b0 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72       ** register
172c0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
172d0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 0;.    }.    c
172e0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
172f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
17300 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
17310 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  T || p->pLeft->o
17320 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
17330 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17340 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
17350 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17360 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
17370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
17390 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70  }../*.** If pExp
173a0 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  r is a constant 
173b0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
173c0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
173d0 6f 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20  or.** factoring 
173e0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74  out of a loop, t
173f0 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65  hen evaluate the
17400 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
17410 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61  nto a register a
17420 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  nd convert the e
17430 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61  xpression into a
17440 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20   TK_REGISTER.** 
17450 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73  expression..*/.s
17460 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f  tatic int evalCo
17470 6e 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a  nstExpr(Walker *
17480 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
17490 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
174a0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
174b0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74  ->pParse;.  swit
174c0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
174d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
174e0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  ISTER: {.      r
174f0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
17500 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17510 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
17520 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
17530 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
17540 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b  TK_CONST_FUNC: {
17550 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72  .      /* The ar
17560 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e  guments to a fun
17570 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78  ction have a fix
17580 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ed destination..
17590 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68        ** Mark th
175a0 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61  em this way to a
175b0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75  void generated u
175c0 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79  nneeded OP_SCopy
175d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
175e0 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a  ctions. .      *
175f0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
17600 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
17610 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
17620 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17630 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17640 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
17650 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
17660 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17670 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  i = pList->nExpr
17680 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
17690 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
176a0 70 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61  pItem = pList->a
176b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
176c0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
176d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
176e0 28 20 41 4c 57 41 59 53 28 70 49 74 65 6d 2d 3e  ( ALWAYS(pItem->
176f0 70 45 78 70 72 29 20 29 20 70 49 74 65 6d 2d 3e  pExpr) ) pItem->
17700 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
17710 45 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20  EP_FixedDest;.  
17720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17740 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41   }.  }.  if( isA
17750 70 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63  ppropriateForFac
17760 74 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b  toring(pExpr) ){
17770 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b  .    int r1 = ++
17780 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17790 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32    int r2;.    r2
177a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
177b0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
177c0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
177d0 20 69 66 28 20 4e 45 56 45 52 28 72 31 21 3d 72   if( NEVER(r1!=r
177e0 32 29 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  2) ) sqlite3Rele
177f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17800 65 2c 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70  e, r1);.    pExp
17810 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
17820 54 45 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  TER;.    pExpr->
17830 69 54 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20  iTable = r2;.   
17840 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
17850 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
17860 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
17870 0a 2f 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61  ./*.** Preevalua
17880 74 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  te constant sube
17890 78 70 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69  xpressions withi
178a0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
178b0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
178c0 20 69 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20   in registers.  
178d0 4d 6f 64 69 66 79 20 70 45 78 70 72 20 73 6f 20  Modify pExpr so 
178e0 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
178f0 74 20 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a  t subexpresions.
17900 2a 2a 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54  ** are TK_REGIST
17910 45 52 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20  ER opcodes that 
17920 72 65 66 65 72 20 74 6f 20 74 68 65 20 70 72 65  refer to the pre
17930 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e  computed values.
17940 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17950 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
17960 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
17970 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
17980 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
17990 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
179a0 76 61 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  valConstExpr;.  
179b0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
179c0 6b 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  k = 0;.  w.pPars
179d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
179e0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
179f0 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a  , pExpr);.}.../*
17a00 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17a10 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
17a20 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
17a30 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
17a40 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
17a50 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
17a60 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17a70 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
17a80 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
17a90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17aa0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
17ab0 76 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  valuated..*/.int
17ac0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17ad0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
17ae0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
17af0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
17b00 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
17b10 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
17b20 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
17b30 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
17b40 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
17b50 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
17b60 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
17b70 2f 0a 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f  /.  int doHardCo
17b80 70 79 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61  py     /* Make a
17b90 20 68 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76   hard copy of ev
17ba0 65 72 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29  ery element */.)
17bb0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
17bc0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17bd0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
17be0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
17bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
17c00 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70  get>0 );.  n = p
17c10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
17c20 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
17c30 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
17c40 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
17c50 69 66 28 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61  if( pItem->iAlia
17c60 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  s ){.      int i
17c70 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28  Reg = codeAlias(
17c80 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69  pParse, pItem->i
17c90 41 6c 69 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45  Alias, pItem->pE
17ca0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
17cb0 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
17cc0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17cd0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
17ce0 28 20 69 52 65 67 21 3d 74 61 72 67 65 74 2b 69  ( iReg!=target+i
17cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17d10 20 4f 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c   OP_SCopy, iReg,
17d20 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
17d30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
17d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17d50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
17d60 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65  em->pExpr, targe
17d70 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t+i);.    }.    
17d80 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79 20 26  if( doHardCopy &
17d90 26 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  & !pParse->db->m
17da0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17db0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17dc0 48 61 72 64 43 6f 70 79 28 70 50 61 72 73 65 2c  HardCopy(pParse,
17dd0 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a 20 20 20   target, n);.   
17de0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17df0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
17e00 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
17e10 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
17e20 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
17e30 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
17e40 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
17e50 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
17e60 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
17e70 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
17e80 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
17e90 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
17ea0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
17eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
17ec0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
17ed0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
17ee0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
17ef0 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
17f00 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
17f10 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
17f20 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
17f30 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
17f40 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
17f50 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
17f60 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
17f70 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
17f80 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
17f90 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
17fa0 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
17fb0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
17fc0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
17fd0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
17fe0 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
17ff0 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
18000 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
18010 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
18020 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
18030 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
18040 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
18050 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
18060 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
18070 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
18080 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
18090 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
180a0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
180b0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
180c0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
180d0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
180e0 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
180f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
18100 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
18110 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
18120 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
18130 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
18140 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
18150 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
18160 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
18170 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
18180 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
18190 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
181a0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
181b0 74 61 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tance of VDBE ch
181c0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
181d0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
181e0 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
181f0 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
18200 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
18210 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
18220 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
18230 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
18240 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
18250 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
18260 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
18280 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
18290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
182a0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
182b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
182c0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
182d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
182e0 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
182f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
18300 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
18310 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
18320 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
18330 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
18340 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
18350 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18360 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
18370 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18380 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
18390 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
183a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
183b0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _OR: {.      tes
183c0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
183d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
183e0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
183f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18400 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
18410 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
18420 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
18430 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
18440 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
18450 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18460 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18470 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
18480 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18490 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
184a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
184b0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
184c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
184d0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
184e0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
184f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18500 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
18510 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
18520 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
18530 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
18540 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
18550 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
18560 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
18570 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
18580 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
18590 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
185a0 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
185b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
185c0 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
185d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
185e0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
185f0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18600 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
18610 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
18620 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
18630 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
18640 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
18650 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54  tcase( op==TK_GT
18660 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18670 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  se( op==TK_GE );
18680 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18690 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20   op==TK_EQ );.  
186a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
186b0 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20  ==TK_NE );.     
186c0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
186d0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
186e0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65    codeCompareOpe
186f0 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45  rands(pParse, pE
18700 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c  xpr->pLeft, &r1,
18710 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
18740 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32  xpr->pRight, &r2
18750 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
18760 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
18770 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18780 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
18790 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
187a0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
187b0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
187c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ull);.      test
187d0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
187e0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
187f0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
18800 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
18810 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18820 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
18830 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
18840 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18850 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
18860 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
18870 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
18880 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
18890 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
188a0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
188b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
188c0 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
188d0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
188e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
188f0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
18900 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
18910 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
18930 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
18940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
18950 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
18960 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18970 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
18980 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
18990 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
189a0 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ND z.      **.  
189b0 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61      ** Is equiva
189c0 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
189d0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e  *.      **    x>
189e0 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
189f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f    **.      ** Co
18a00 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74  de it as such, t
18a10 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f  aking care to do
18a20 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65   the common sube
18a30 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20  xpression.      
18a40 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20  ** elementation 
18a50 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  of x..      */. 
18a60 20 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e       Expr exprAn
18a70 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  d;.      Expr co
18a80 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  mpLeft;.      Ex
18a90 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  pr compRight;.  
18aa0 20 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a      Expr exprX;.
18ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18ac0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18ad0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
18ae0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 65 78  ect) );.      ex
18af0 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c  prX = *pExpr->pL
18b00 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
18b10 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
18b20 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c        exprAnd.pL
18b30 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
18b40 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70  .      exprAnd.p
18b50 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
18b60 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  ht;.      compLe
18b70 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20  ft.op = TK_GE;. 
18b80 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c       compLeft.pL
18b90 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
18ba0 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69      compLeft.pRi
18bb0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
18bc0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
18bd0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
18be0 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
18bf0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c      compRight.pL
18c00 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
18c10 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52      compRight.pR
18c20 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
18c30 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
18c40 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69  r;.      exprX.i
18c50 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
18c60 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18c70 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
18c80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
18c90 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
18ca0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
18cb0 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  rX.op = TK_REGIS
18cc0 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63  TER;.      testc
18cd0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18ce0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
18cf0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
18d00 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
18d10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18d20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18d30 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
18d40 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
18d50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
18d60 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
18d70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
18d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c  AddOp3(v, OP_If,
18da0 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r1, dest, jumpI
18db0 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20  fNull!=0);.     
18dc0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18dd0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
18de0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
18df0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
18e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18e10 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
18e20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
18e30 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
18e40 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18e50 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
18e60 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
18e70 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18e80 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
18e90 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
18ea0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
18eb0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
18ec0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
18ed0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
18ee0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
18ef0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
18f00 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
18f10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18f20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
18f30 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18f40 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
18f50 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
18f60 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
18f70 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
18f80 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
18f90 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
18fa0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
18fb0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
18fc0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
18fd0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
18fe0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
18ff0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
19000 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
19010 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
19020 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
19030 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
19040 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
19050 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
19060 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
19070 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
19080 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
19090 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
190a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
190b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
190c0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
190d0 45 78 69 73 74 61 6e 63 65 20 6f 66 20 56 44 42  Existance of VDB
190e0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
190f0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
19100 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
19110 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
19120 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
19130 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
19140 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
19150 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
19160 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
19170 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
19180 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
19190 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
191a0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
191b0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
191c0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
191d0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
191e0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
191f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
19200 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
19210 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
19220 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
19230 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
19240 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
19250 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
19260 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
19270 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
19280 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
19290 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
192a0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
192b0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
192c0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
192d0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
192e0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
192f0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
19300 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
19310 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
19320 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
19330 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
19340 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
19350 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
19360 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
19370 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
19380 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
19390 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
193a0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
193b0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
193c0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
193d0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
193e0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
193f0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
19400 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
19410 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
19420 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
19430 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
19440 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
19450 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
19460 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
19470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
19480 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
19490 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
194a0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
194b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
194c0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
194d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
194e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
194f0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
19500 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
19510 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
19520 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
19530 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
19540 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
19550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
19560 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
19570 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
19580 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19590 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
195a0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
195b0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
195c0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
195d0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
195e0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
195f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
19600 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
19610 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
19620 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
19630 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
19640 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19650 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
19660 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
19670 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
19680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19690 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
196a0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
196b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
196c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
196d0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
196e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
196f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19700 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
19710 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19720 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
19730 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a  pr->pLeft, d2, j
19740 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
19750 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
19770 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
19780 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
19790 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
197a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
197b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
197c0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , d2);.      sql
197d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
197e0 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20  (pParse, 1);.   
197f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19800 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
19810 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
19820 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
19830 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
19840 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
19850 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
19860 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19870 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
19880 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
19890 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
198a0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
198b0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
198c0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
198d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
198e0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
198f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
19900 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19910 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
19920 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19930 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
19940 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19950 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
19960 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19970 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
19980 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
19990 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  l==0 );.      co
199a0 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
199b0 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
199c0 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65  >pLeft, &r1, &re
199d0 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20  gFree1,.        
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19a00 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72  >pRight, &r2, &r
19a10 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
19a20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
19a30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
19a40 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
19a50 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
19a60 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
19a70 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19a80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19a90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
19aa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19ab0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
19ac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ad0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
19ae0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
19af0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
19b00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
19b10 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
19b20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
19b30 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
19b40 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
19b50 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
19b60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
19b70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
19b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19b90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
19ba0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
19bb0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19bc0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19bd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19be0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
19bf0 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20  N: {.      /*   
19c00 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
19c10 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   z.      **.    
19c20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65    ** Is equivale
19c30 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a  nt to .      **.
19c40 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79        **    x>=y
19c50 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20   AND x<=z.      
19c60 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65  **.      ** Code
19c70 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
19c80 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
19c90 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
19ca0 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
19cb0 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
19cc0 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   x..      */.   
19cd0 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b     Expr exprAnd;
19ce0 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
19cf0 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
19d00 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20   compRight;.    
19d10 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20    Expr exprX;.. 
19d20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
19d30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19d40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19d50 74 29 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  t) );.      expr
19d60 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
19d70 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
19d80 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
19d90 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
19da0 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
19db0 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
19dc0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
19dd0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
19de0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
19df0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
19e00 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
19e10 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
19e20 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
19e30 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
19e40 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
19e50 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
19e60 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
19e70 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
19e80 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
19e90 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
19ea0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
19eb0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61  .      exprX.iTa
19ec0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
19ed0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
19ee0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
19ef0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
19f00 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
19f10 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58  0 );.      exprX
19f20 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
19f30 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R;.      testcas
19f40 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
19f50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
19f60 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
19f70 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
19f80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
19f90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19fa0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
19fb0 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
19fc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19fd0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
19fe0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a000 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
1a010 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  t, r1, dest, jum
1a020 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
1a030 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1a040 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1a050 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1a060 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1a070 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a080 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a090 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a0a0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1a0b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a0c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a0d0 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
1a0e0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
1a0f0 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
1a100 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
1a110 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
1a120 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
1a130 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
1a140 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
1a150 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
1a160 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  r in any way..**
1a170 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
1a180 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1a190 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65  return FALSE eve
1a1a0 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78 70  n if the two exp
1a1b0 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c  ressions.** real
1a1c0 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  ly are equivalen
1a1d0 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74  t.  If we cannot
1a1e0 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1a1f0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
1a200 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65  ** identical, we
1a210 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75   return FALSE ju
1a220 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20  st to be safe.  
1a230 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
1a240 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61  ne.** returns fa
1a250 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  lse, then you do
1a260 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
1a270 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
1a280 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
1a290 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1a2a0 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
1a2b0 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74 75   get a TRUE retu
1a2c0 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20  rn, then you.** 
1a2d0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65 20  can be sure the 
1a2e0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1a2f0 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68  the same.  In th
1a300 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a  e places where.*
1a310 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1a320 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20  s used, it does 
1a330 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74 20  not hurt to get 
1a340 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d  an extra FALSE -
1a350 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
1a360 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
1a370 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
1a380 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
1a390 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
1a3a0 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f 75  correct TRUE cou
1a3b0 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
1a3c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1a3d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1a3e0 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
1a3f0 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69  pr *pB){.  int i
1a400 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70  ;.  if( pA==0||p
1a410 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  B==0 ){.    retu
1a420 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20  rn pB==pA;.  }. 
1a430 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1a440 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 41 2c  sAnyProperty(pA,
1a450 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1a460 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 61  _Reduced) );.  a
1a470 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 41  ssert( !ExprHasA
1a480 6e 79 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45  nyProperty(pB, E
1a490 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
1a4a0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 69 66 28  educed) );.  if(
1a4b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1a4c0 28 70 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pA, EP_xIsSelec
1a4d0 74 29 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  t) || ExprHasPro
1a4e0 70 65 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73  perty(pB, EP_xIs
1a4f0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
1a500 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a510 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20  f( (pA->flags & 
1a520 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70  EP_Distinct)!=(p
1a530 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  B->flags & EP_Di
1a540 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e  stinct) ) return
1a550 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   0;.  if( pA->op
1a560 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
1a570 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
1a580 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1a590 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
1a5a0 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
1a5b0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
1a5c0 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
1a5d0 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
1a5e0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  t) ) return 0;..
1a5f0 20 20 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73    if( pA->x.pLis
1a600 74 20 26 26 20 70 42 2d 3e 78 2e 70 4c 69 73 74  t && pB->x.pList
1a610 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
1a620 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
1a630 70 42 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pB->x.pList->nEx
1a640 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
1a650 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
1a660 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1a670 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
1a680 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d  pr *pExprA = pA-
1a690 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
1a6a0 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1a6b0 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 78   *pExprB = pB->x
1a6c0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
1a6d0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73  pr;.      if( !s
1a6e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1a6f0 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  e(pExprA, pExprB
1a700 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1a710 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1a720 70 41 2d 3e 78 2e 70 4c 69 73 74 20 7c 7c 20 70  pA->x.pList || p
1a730 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20  B->x.pList ){.  
1a740 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a750 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
1a760 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
1a770 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
1a780 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
1a790 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1a7a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 41 2c 20  HasProperty(pA, 
1a7b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a  EP_IntValue) ){.
1a7c0 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
1a7d0 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50 5f  Property(pB, EP_
1a7e0 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 41 2d  IntValue) || pA-
1a7f0 3e 75 2e 69 56 61 6c 75 65 21 3d 70 42 2d 3e 75  >u.iValue!=pB->u
1a800 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
1a810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1a820 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
1a830 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
1a840 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  & pA->u.zToken )
1a850 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
1a860 73 50 72 6f 70 65 72 74 79 28 70 42 2c 20 45 50  sProperty(pB, EP
1a870 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 4e 45  _IntValue) || NE
1a880 56 45 52 28 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e  VER(pB->u.zToken
1a890 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1a8a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a8b0 53 74 72 49 43 6d 70 28 70 41 2d 3e 75 2e 7a 54  StrICmp(pA->u.zT
1a8c0 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65  oken,pB->u.zToke
1a8d0 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
1a8e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1a8f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1a900 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
1a910 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1a920 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
1a930 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
1a940 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
1a950 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
1a960 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
1a970 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
1a980 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
1a990 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
1a9a0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c  ggInfoColumn(sql
1a9b0 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
1a9c0 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
1a9d0 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
1a9e0 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
1a9f0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1aa00 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66   db,.       pInf
1aa10 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  o->aCol,.       
1aa20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
1aa30 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33  ol[0]),.       3
1aa40 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
1aa50 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
1aa60 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
1aa70 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
1aa80 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
1aa90 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41  ;.}    ../*.** A
1aaa0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1aab0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
1aac0 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e  ->aFunc[] array.
1aad0 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
1aae0 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
1aaf0 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
1ab00 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
1ab10 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
1ab20 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1ab30 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e  nt addAggInfoFun
1ab40 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  c(sqlite3 *db, A
1ab50 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
1ab60 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
1ab70 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
1ab80 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1ab90 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20         db, .    
1aba0 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c     pInfo->aFunc,
1abb0 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
1abc0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c  Info->aFunc[0]),
1abd0 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
1abe0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
1abf0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
1ac00 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20  nFuncAlloc,.    
1ac10 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
1ac20 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
1ac30 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1ac40 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f  xExprCallback fo
1ac50 72 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e  r a tree walker.
1ac60 20 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a    It is used to.
1ac70 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c  ** implement sql
1ac80 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1ac90 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
1aca0 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
1acb0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
1acc0 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
1acd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
1ace0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1acf0 79 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c  yzeAggregate(Wal
1ad00 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
1ad10 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
1ad20 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
1ad30 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65  xt *pNC = pWalke
1ad40 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73  r->u.pNC;.  Pars
1ad50 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
1ad60 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
1ad70 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
1ad80 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
1ad90 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1ada0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
1adb0 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
1adc0 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1add0 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1ade0 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1adf0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74  OLUMN: {.      t
1ae00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1ae10 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1ae20 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
1ae30 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
1ae40 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1ae50 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
1ae60 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ee if the column
1ae70 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68   is in one of th
1ae80 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
1ae90 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c  FROM.      ** cl
1aea0 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
1aeb0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
1aec0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1aed0 70 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a  pSrcList!=0) ){.
1aee0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
1aef0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1af00 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
1af10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
1af20 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
1af30 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1af40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
1af50 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1af60 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
1af70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1af80 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
1af90 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1afa0 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
1afb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1afc0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
1afd0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1aff0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1b000 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
1b010 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
1b020 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
1b030 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
1b040 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
1b050 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
1b060 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
1b070 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
1b080 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
1b090 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1b0a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
1b0b0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
1b0c0 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
1b0d0 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
1b0e0 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
1b0f0 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
1b100 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1b110 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
1b120 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
1b130 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
1b140 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
1b150 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
1b160 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
1b170 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1b180 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
1b190 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
1b1a0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
1b1b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1b1c0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
1b1d0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
1b1e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1b200 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b210 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e           if( (k>
1b220 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  =pAggInfo->nColu
1b230 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn).            
1b240 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49   && (k = addAggI
1b250 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  nfoColumn(pParse
1b260 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29  ->db, pAggInfo))
1b270 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
1b280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b290 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e    pCol = &pAggIn
1b2a0 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20  fo->aCol[k];.   
1b2b0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1b2c0 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70  >pTab = pExpr->p
1b2d0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
1b2e0 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20     pCol->iTable 
1b2f0 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
1b300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b310 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  Col->iColumn = p
1b320 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1b340 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
1b350 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1b360 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
1b370 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31  orterColumn = -1
1b380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b390 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45  pCol->pExpr = pE
1b3a0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
1b3b0 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d     if( pAggInfo-
1b3c0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
1b3e0 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   j, n;.         
1b3f0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
1b400 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d  *pGB = pAggInfo-
1b410 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
1b420 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
1b430 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1b440 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b  *pTerm = pGB->a;
1b450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b460 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b   n = pGB->nExpr;
1b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b480 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a   for(j=0; j<n; j
1b490 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d  Expr *pE = pTerm
1b4c0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
1b4d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1b4e0 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  E->op==TK_COLUMN
1b4f0 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d   && pE->iTable==
1b500 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
1b510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b520 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75         pE->iColu
1b530 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
1b540 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
1b550 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
1b560 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
1b570 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
1b580 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1b5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b5c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b5d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
1b5e0 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  terColumn<0 ){. 
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b600 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1b610 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  mn = pAggInfo->n
1b620 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b  SortingColumn++;
1b630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b640 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1b650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b660 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e  ere is now an en
1b670 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e  try for pExpr in
1b680 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1b690 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20  ] (either.      
1b6a0 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
1b6b0 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65   it was there be
1b6c0 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20  fore or because 
1b6d0 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20  we just created 
1b6e0 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  it)..           
1b6f0 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   ** Convert the 
1b700 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b  pExpr to be a TK
1b710 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65  _AGG_COLUMN refe
1b720 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20  rring to that.  
1b730 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67            ** pAg
1b740 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e  gInfo->aCol[] en
1b750 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
1b760 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b770 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
1b780 6c 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  le(pExpr);.     
1b790 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
1b7a0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
1b7b0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
1b7c0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
1b7d0 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
1b7e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
1b7f0 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
1b800 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b810 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
1b820 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
1b830 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
1b840 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
1b850 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
1b860 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
1b870 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1b880 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1b890 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
1b8a0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
1b8b0 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
1b8c0 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
1b8d0 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
1b8e0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
1b8f0 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
1b900 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
1b910 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
1b920 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
1b930 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
1b940 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
1b950 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
1b960 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
1b970 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
1b980 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
1b990 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
1b9a0 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1b9b0 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
1b9c0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1b9d0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
1b9e0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
1b9f0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
1ba00 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1ba10 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
1ba20 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1ba30 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
1ba40 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
1ba50 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
1ba60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1ba70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ba80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ba90 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
1baa0 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
1bab0 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
1bac0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
1bad0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
1bae0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
1baf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1bb00 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
1bb10 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
1bb20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
1bb30 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
1bb40 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
1bb50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
1bb60 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20  if( i>=0 ){.    
1bb70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bb80 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1bb90 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1bba0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20  lect) );.       
1bbb0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
1bbc0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
1bbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
1bbe0 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
1bbf0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1bc00 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b  pItem->iMem = ++
1bc10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1bc20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1bc30 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1bc40 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
1bc50 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
1bc60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75        pItem->pFu
1bc70 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
1bc80 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
1bc90 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
1bca0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
1bcb0 2e 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33  .zToken, sqlite3
1bcc0 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1bcd0 75 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20  u.zToken),.     
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1bcf0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70  xpr->x.pList ? p
1bd00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1bd10 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
1bd20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1bd30 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
1bd40 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
1bd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1bd60 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
1bd70 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1bd80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1bd90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1bda0 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
1bdb0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1bdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bdd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1bde0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45        /* Make pE
1bdf0 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  xpr point to the
1be00 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67   appropriate pAg
1be10 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65  gInfo->aFunc[] e
1be20 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ntry.        */.
1be30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1be40 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
1be50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
1be60 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
1be70 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ed) );.        E
1be80 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62 6c  xprSetIrreducibl
1be90 65 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  e(pExpr);.      
1bea0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
1beb0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
1bec0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
1bed0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
1bee0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1bef0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rune;.      }.  
1bf00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bf10 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1bf20 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1bf30 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
1bf40 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
1bf50 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1bf60 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43  Select){.  NameC
1bf70 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57  ontext *pNC = pW
1bf80 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
1bf90 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
1bfa0 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e  =0 ){.    pNC->n
1bfb0 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c  Depth++;.    sql
1bfc0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1bfd0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29  Walker, pSelect)
1bfe0 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
1bff0 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h--;.    return 
1c000 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c  WRC_Prune;.  }el
1c010 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  se{.    return W
1c020 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
1c030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
1c040 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
1c050 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
1c060 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
1c070 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
1c080 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
1c090 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
1c0a0 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
1c0b0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
1c0c0 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
1c0d0 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
1c0e0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1c0f0 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1c100 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
1c110 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
1c120 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
1c130 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
1c140 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
1c150 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
1c160 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
1c170 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
1c180 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1c190 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
1c1a0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1c1b0 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b   *pExpr){.  Walk
1c1c0 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43  er w;.  w.xExprC
1c1d0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
1c1e0 65 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e  eAggregate;.  w.
1c1f0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1c200 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
1c210 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77  tesInSelect;.  w
1c220 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
1c230 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72  assert( pNC->pSr
1c240 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 71  cList!=0 );.  sq
1c250 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1c260 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1c270 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1c280 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1c290 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1c2a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1c2b0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1c2c0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1c2d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1c2e0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1c2f0 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1c300 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1c310 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1c320 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1c330 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1c340 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1c350 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1c360 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1c370 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c380 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c390 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1c3a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1c3b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c3c0 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1c3d0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1c3e0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1c3f0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1c400 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1c410 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1c420 6c 6f 63 61 74 65 20 61 20 73 69 6e 67 6c 65 20  locate a single 
1c430 6e 65 77 20 72 65 67 69 73 74 65 72 20 66 6f 72  new register for
1c440 20 75 73 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d   use to hold som
1c450 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  e intermediate r
1c460 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  esult..*/.int sq
1c470 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c480 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1c490 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54    if( pParse->nT
1c4a0 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  empReg==0 ){.   
1c4b0 20 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65   return ++pParse
1c4c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65  ->nMem;.  }.  re
1c4d0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65  turn pParse->aTe
1c4e0 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e  mpReg[--pParse->
1c4f0 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a  nTempReg];.}../*
1c500 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
1c510 20 72 65 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e   register, makin
1c520 67 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  g available for 
1c530 72 65 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  reuse for some o
1c540 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e  ther.** purpose.
1c550 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69  .**.** If a regi
1c560 73 74 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ster is currentl
1c570 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
1c580 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
1c590 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61  , then.** the da
1c5a0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65 66  llocation is def
1c5b0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
1c5c0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e  column cache lin
1c5d0 65 20 74 68 61 74 20 75 73 65 73 0a 2a 2a 20 74  e that uses.** t
1c5e0 68 65 20 72 65 67 69 73 74 65 72 20 62 65 63 6f  he register beco
1c5f0 6d 65 73 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f  mes stale..*/.vo
1c600 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
1c610 65 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a  eTempReg(Parse *
1c620 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
1c630 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20 26 26  ){.  if( iReg &&
1c640 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
1c650 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
1c660 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
1c670 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c680 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1c690 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   *p;.    for(i=0
1c6a0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
1c6b0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
1c6c0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
1c6d0 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   p++){.      if(
1c6e0 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29   p->iReg==iReg )
1c6f0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 74 65 6d  {.        p->tem
1c700 70 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  pReg = 1;.      
1c710 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1c720 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  }.    }.    pPar
1c730 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
1c740 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
1c750 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
1c760 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
1c770 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
1c780 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
1c790 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
1c7a0 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
1c7b0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
1c7c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c7d0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
1c7e0 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
1c7f0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
1c800 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
1c810 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
1c820 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f  <=n && !usedAsCo
1c830 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
1c840 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20  , i, i+n-1) ){. 
1c850 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
1c860 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
1c870 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
1c880 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
1c890 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
1c8a0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1c8b0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1c8c0 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
1c8d0 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
1c8e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c8f0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
1c900 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
1c910 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28  int nReg){.  if(
1c920 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
1c930 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
1c940 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
1c950 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
1c960 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
1c970 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a            iReg;.  }.}.