/ Hex Artifact Content
Login

Artifact 46e24f9a71e7bdd2573a790ba2f98b7c3f617d04:


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 31 36 20 32 30 30 39 2f 30 32 2f 32 34 20  .416 2009/02/24 
0220: 31 30 3a 31 34 3a 34 30 20 64 61 6e 69 65 6c 6b  10:14:40 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0260: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0270: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0280: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0290: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
02a0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
02b0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
02c0: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
02d0: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02e0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02f0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
0300: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
0310: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
0320: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
0330: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0340: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0350: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0360: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0370: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0380: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0390: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
03a0: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
03b0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
03c0: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
03d0: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03e0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0400: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
0410: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
0420: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
0430: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0440: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0450: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0460: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0470: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0480: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0490: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
04a0: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
04b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
04c0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  LECT ){.    asse
04d0: 72 74 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  rt( pExpr->flags
04e0: 26 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 3b  &EP_xIsSelect );
04f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0500: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0510: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
0520: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0530: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0540: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0550: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0560: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0570: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0580: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0590: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
05a0: 69 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  if.  if( (op==TK
05b0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
05c0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
05d0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op==TK_REGISTER)
05e0: 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70   .   && pExpr->p
05f0: 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  Tab!=0.  ){.    
0600: 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  /* op==TK_REGIST
0610: 45 52 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ER && pExpr->pTa
0620: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
0630: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
0640: 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 61 20  inally.    ** a 
0650: 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61  TK_COLUMN but wa
0660: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61  s previously eva
0670: 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65  luated and cache
0680: 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20  d in a register 
0690: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  */.    int j = p
06a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
06b0: 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74     if( j<0 ) ret
06c0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  urn SQLITE_AFF_I
06d0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 61 73 73 65  NTEGER;.    asse
06e0: 72 74 28 20 70 45 78 70 72 2d 3e 70 54 61 62 20  rt( pExpr->pTab 
06f0: 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70 54 61 62  && j<pExpr->pTab
0700: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 72 65  ->nCol );.    re
0710: 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 54 61 62  turn pExpr->pTab
0720: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
0730: 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
0740: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
0750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
0760: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0770: 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73  uence for expres
0780: 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65  sion pExpr to be
0790: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
07a0: 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64  * sequence named
07b0: 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65   by pToken.   Re
07c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
07d0: 6f 20 74 68 65 20 72 65 76 69 73 65 64 20 65 78  o the revised ex
07e0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65  pression..** The
07f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0800: 6e 63 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nce is marked as
0810: 20 22 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e   "explicit" usin
0820: 67 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c  g the EP_ExpColl
0830: 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e  ate.** flag.  An
0840: 20 65 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74   explicit collat
0850: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
0860: 6c 20 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69  l override impli
0870: 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  cit.** collating
0880: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45   sequences..*/.E
0890: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
08a0: 53 65 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70  SetColl(Parse *p
08b0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
08c0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  pr, Token *pColl
08d0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
08e0: 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Coll = 0;       
08f0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
0900: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
0910: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
0920: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
0930: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0940: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
0950: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
0960: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
0970: 70 43 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20 69 66  pCollName);.  if
0980: 28 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c  ( pExpr && zColl
0990: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
09a0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
09b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
09c0: 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28  ll, -1);.    if(
09d0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
09e0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
09f0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70  Coll;.      pExp
0a00: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  r->flags |= EP_E
0a10: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  xpCollate;.    }
0a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
0a30: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
0a40: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0a60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
0a70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
0a80: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0a90: 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20  on pExpr. If.** 
0aa0: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61  there is no defa
0ab0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79  ult collation ty
0ac0: 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  pe, return 0..*/
0ad0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0ae0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0af0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0b00: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
0b10: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0b20: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0b30: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0b40: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20  .    int op;.   
0b50: 20 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43 6f 6c   pColl = p->pCol
0b60: 6c 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  l;.    if( pColl
0b70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 70   ) break;.    op
0b80: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66   = p->op;.    if
0b90: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
0ba0: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
0bb0: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0bc0: 52 45 47 49 53 54 45 52 29 20 26 26 20 70 2d 3e  REGISTER) && p->
0bd0: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
0be0: 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   /* op==TK_REGIS
0bf0: 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  TER && p->pTab!=
0c00: 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  0 happens when p
0c10: 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61  Expr was origina
0c20: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54  lly.      ** a T
0c30: 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73  K_COLUMN but was
0c40: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c   previously eval
0c50: 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64  uated and cached
0c60: 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a   in a register *
0c70: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
0c80: 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ar *zColl;.     
0c90: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
0ca0: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
0cb0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
0cc0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0cd0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  rse->db;.       
0ce0: 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62   zColl = p->pTab
0cf0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
0d00: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0d10: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0d20: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0d30: 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a   zColl, -1, 0);.
0d40: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
0d50: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
0d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
0d70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
0d80: 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20   op!=TK_CAST && 
0d90: 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op!=TK_UPLUS ){.
0da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0db0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c   }.    p = p->pL
0dc0: 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  eft;.  }.  if( s
0dd0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0de0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0df0: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0e00: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0e10: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0e20: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0e30: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0e40: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0e50: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0e60: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0e70: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0e80: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0e90: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0ea0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0eb0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0ec0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0ed0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0ee0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0ef0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0f00: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0f10: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0f20: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0f30: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0f40: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0f50: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0f60: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0f70: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0f80: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0f90: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0fa0: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0fb0: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0fc0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0fd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0fe0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0ff0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
1000: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
1010: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1020: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1030: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1040: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1060: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1070: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1080: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1090: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
10a0: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
10b0: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
10c0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
10d0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
10e0: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
10f0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1100: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1120: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1130: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1140: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1150: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1160: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1170: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1180: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1190: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
11a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
11b0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
11c0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
11d0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
11e0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
11f0: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
1200: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
1210: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1220: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1230: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1240: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1250: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1260: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1270: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1280: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
1290: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
12a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
12b0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
12c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
12d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
12e0: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
12f0: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
1300: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
1310: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
1320: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1330: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1340: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1350: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
1360: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
1370: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1380: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1390: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
13a0: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  t, aff);.  }else
13b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
13c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
13d0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
13e0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13f0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1400: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
1410: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1420: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73  pr, aff);.  }els
1430: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
1440: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
1450: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72  FF_NONE;.  }.  r
1460: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
1470: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
1480: 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73  omparison expres
1490: 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27  sion, eg. '=', '
14a0: 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e  <', IN(...) etc.
14b0: 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79  .** idx_affinity
14c0: 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   is the affinity
14d0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63   of an indexed c
14e0: 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72  olumn. Return tr
14f0: 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64  ue.** if the ind
1500: 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79  ex with affinity
1510: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61   idx_affinity ma
1520: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  y be used to imp
1530: 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f  lement.** the co
1540: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70  mparison in pExp
1550: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1560: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
1570: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68  (Expr *pExpr, ch
1580: 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29  ar idx_affinity)
1590: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63  {.  char aff = c
15a0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
15b0: 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74  y(pExpr);.  swit
15c0: 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63  ch( aff ){.    c
15d0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
15e0: 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ONE:.      retur
15f0: 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51  n 1;.    case SQ
1600: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20  LITE_AFF_TEXT:. 
1610: 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f       return idx_
1620: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1630: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64  _AFF_TEXT;.    d
1640: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1650: 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75  turn sqlite3IsNu
1660: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64  mericAffinity(id
1670: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d  x_affinity);.  }
1680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1690: 20 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68   the P5 value th
16a0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
16b0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
16c0: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
16d0: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
16e0: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
16f0: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1700: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74  nd pExpr2..*/.st
1710: 61 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f  atic u8 binaryCo
1720: 6d 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45  mpareP5(Expr *pE
1730: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
1740: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
1750: 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20  ll){.  u8 aff = 
1760: 28 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70  (char)sqlite3Exp
1770: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
1780: 29 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73  );.  aff = (u8)s
1790: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
17a0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
17b0: 66 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e  f) | (u8)jumpIfN
17c0: 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66  ull;.  return af
17d0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  f;.}../*.** Retu
17e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17f0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1800: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1810: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1820: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1830: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1840: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1850: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
1860: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
1870: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1880: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
1890: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
18a0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
18b0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
18c0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18d0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
18e0: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
18f0: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1900: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1910: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1920: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1930: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1940: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1950: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
1960: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
1970: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
1980: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
1990: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
19a0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  red..*/.CollSeq 
19b0: 2a 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f  *sqlite3BinaryCo
19c0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
19d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
19e0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
19f0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1a00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1a10: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1a20: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1a30: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1a40: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1a50: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1a60: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
1a70: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1a80: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
1a90: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
1aa0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1ab0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1ac0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1ad0: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1ae0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1b10: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1b20: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1b30: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1b40: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1b50: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1b60: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1b70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b80: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1b90: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70   Generate the op
1ba0: 65 72 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d  erands for a com
1bb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
1bc0: 6e 2e 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65  n.  Before.** ge
1bd0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
1be0: 65 20 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61  e for each opera
1bf0: 6e 64 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41  nd, set the EP_A
1c00: 6e 79 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e  nyAff.** flag on
1c10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c20: 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1c30: 62 65 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20  be able to used 
1c40: 61 0a 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75  a.** cached colu
1c50: 6d 6e 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  mn value that ha
1c60: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64  s previously und
1c70: 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66  ergone an.** aff
1c80: 69 6e 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f  inity change..*/
1c90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
1ca0: 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
1cb0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cc0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
1cd0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1ce0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
1cf0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1d00: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1d10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1d20: 20 2a 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f   *pRegLeft,    /
1d30: 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72 65  * Register where
1d40: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73   left operand is
1d50: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
1d60: 20 2a 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f   *pFreeLeft,   /
1d70: 2a 20 46 72 65 65 20 74 68 69 73 20 72 65 67 69  * Free this regi
1d80: 73 74 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a  ster when done *
1d90: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
1da0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1db0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1dc0: 69 6e 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20  int *pRegRight, 
1dd0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68    /* Register wh
1de0: 65 72 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  ere right operan
1df0: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1e00: 20 69 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74   int *pFreeRight
1e10: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70     /* Write temp
1e20: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 69   register for ri
1e30: 67 68 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72  ght operand ther
1e40: 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28  e */.){.  while(
1e50: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55   pLeft->op==TK_U
1e60: 50 4c 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70  PLUS ) pLeft = p
1e70: 4c 65 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  Left->pLeft;.  p
1e80: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Left->flags |= E
1e90: 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65  P_AnyAff;.  *pRe
1ea0: 67 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  gLeft = sqlite3E
1eb0: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ec0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65  se, pLeft, pFree
1ed0: 4c 65 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  Left);.  while( 
1ee0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55  pRight->op==TK_U
1ef0: 50 4c 55 53 20 29 20 70 52 69 67 68 74 20 3d 20  PLUS ) pRight = 
1f00: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20  pRight->pLeft;. 
1f10: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c   pRight->flags |
1f20: 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a  = EP_AnyAff;.  *
1f30: 70 52 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69  pRegRight = sqli
1f40: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f50: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1f60: 70 46 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a  pFreeRight);.}..
1f70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1f80: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1f90: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1fa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1fb0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1fd0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1fe0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1ff0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
2000: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2010: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
2020: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2030: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
2040: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
2050: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
2060: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
2070: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
2080: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20  e */.  int in1, 
2090: 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69  int in2, /* Regi
20a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65  ster holding ope
20b0: 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rands */.  int d
20c0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
20d0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75  Jump here if tru
20e0: 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  e.  */.  int jum
20f0: 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66  pIfNull    /* If
2100: 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65   true, jump if e
2110: 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73  ither operand is
2120: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
2130: 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72  t p5;.  int addr
2140: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b  ;.  CollSeq *p4;
2150: 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33  ..  p4 = sqlite3
2160: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
2170: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
2180: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70  ft, pRight);.  p
2190: 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  5 = binaryCompar
21a0: 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP5(pLeft, pRigh
21b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
21c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
21d0: 56 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73  VdbeAddOp4(pPars
21e0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
21f0: 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31  , in2, dest, in1
2200: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
2220: 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53  id*)p4, P4_COLLS
2230: 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EQ);.  sqlite3Vd
2240: 62 65 43 68 61 6e 67 65 50 35 28 70 50 61 72 73  beChangeP5(pPars
2250: 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35  e->pVdbe, (u8)p5
2260: 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26 20 53  );.  if( (p5 & S
2270: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21  QLITE_AFF_MASK)!
2280: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
2290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
22a0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
22b0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
22c0: 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  n1, 1);.    sqli
22d0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
22e0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
22f0: 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a  e, in2, 1);.  }.
2300: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
2310: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2320: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a  _EXPR_DEPTH>0./*
2330: 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .** Check that a
2340: 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20  rgument nHeight 
2350: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2360: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
2370: 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69  imum.** expressi
2380: 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64  on depth allowed
2390: 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
23a0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
23b0: 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61  essage in.** pPa
23c0: 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rse..*/.int sqli
23d0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
23e0: 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ht(Parse *pParse
23f0: 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a  , int nHeight){.
2400: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2410: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65  E_OK;.  int mxHe
2420: 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  ight = pParse->d
2430: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
2440: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2450: 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68  H];.  if( nHeigh
2460: 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20  t>mxHeight ){.  
2470: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2480: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
2490: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
24a0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
24b0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
24c0: 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20  d)", mxHeight.  
24d0: 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51    );.    rc = SQ
24e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
24f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2500: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2510: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
2520: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
2530: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
2540: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
2550: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
2560: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
2570: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
2580: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
2590: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
25a0: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
25b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
25c0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
25d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
25e0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
25f0: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
2600: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
2610: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
2620: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
2630: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
2640: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
2650: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
2660: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
2670: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2680: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
2690: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
26a0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
26b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
26c0: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
26d0: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
26e0: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
26f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
2700: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
2710: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
2720: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
2730: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
2740: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2760: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2770: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2780: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
2790: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
27a0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
27b0: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
27c0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
27d0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
27e0: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
27f0: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
2800: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2810: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2820: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
2830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2840: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
2850: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2860: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2870: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
2880: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
2890: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
28a0: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
28b0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
28c0: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
28d0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
28e0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
28f0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
2900: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2910: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2920: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
2930: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2940: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
2950: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
2960: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
2970: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
2980: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
2990: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
29a0: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
29b0: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
29c0: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
29d0: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
29e0: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
29f0: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
2a00: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
2a10: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
2a20: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
2a30: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
2a40: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
2a50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2a60: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2a70: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2a80: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2a90: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2aa0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2ab0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2ac0: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2ad0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2ae0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2af0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2b00: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2b10: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2b20: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ight);.  }else{.
2b30: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2b40: 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c  List(p->x.pList,
2b50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a   &nHeight);.  }.
2b60: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
2b70: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
2b80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2b90: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2ba0: 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70  le using the exp
2bb0: 72 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e  rSetHeight() fun
2bc0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65  ction. If.** the
2bd0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2be0: 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69  er than the maxi
2bf0: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72  mum allowed expr
2c00: 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a  ession depth,.**
2c10: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2c20: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
2c30: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  id sqlite3ExprSe
2c40: 74 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  tHeight(Parse *p
2c50: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b  Parse, Expr *p){
2c60: 0a 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74  .  exprSetHeight
2c70: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (p);.  sqlite3Ex
2c80: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
2c90: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
2ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2cb0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
2cc0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
2cd0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
2ce0: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
2cf0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
2d00: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
2d10: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
2d20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d30: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
2d40: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2d50: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2d60: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
2d70: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
2d80: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65  nHeight;.}.#else
2d90: 0a 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53  .  #define exprS
2da0: 65 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64  etHeight(y).#end
2db0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
2dc0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f  _EXPR_DEPTH>0 */
2dd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
2de0: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
2df0: 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75  on node and retu
2e00: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2e10: 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66  it.  Memory.** f
2e20: 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20  or this node is 
2e30: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2e40: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
2e50: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2e60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
2e70: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2e80: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
2e90: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
2ea0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20   freed..*/.Expr 
2eb0: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
2ec0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
2ee0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
2ef0: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
2f00: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
2f10: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2f20: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
2f30: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
2f40: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
2f60: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
2f70: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2f80: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
2f90: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
2fa0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
2fb0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
2fc0: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
2fd0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
2fe0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2ff0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
3000: 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  f(Expr));.  if( 
3010: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
3020: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
3030: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
3040: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
3050: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
3060: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
3070: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
3080: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
3090: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
30a0: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
30b0: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
30c0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
30d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
30e0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c   pLeft);.    sql
30f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
3100: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
3110: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3120: 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f  pNew->op = (u8)o
3130: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  p;.  pNew->pLeft
3140: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77   = pLeft;.  pNew
3150: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
3160: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20  t;.  pNew->iAgg 
3170: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70  = -1;.  pNew->sp
3180: 61 6e 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a  an.z = (u8*)"";.
3190: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
31a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
31b0: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
31c0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
31d0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
31e0: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oken;.  }else if
31f0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69  ( pLeft ){.    i
3200: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
3210: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73     if( pRight->s
3220: 70 61 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c  pan.dyn==0 && pL
3230: 65 66 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30  eft->span.dyn==0
3240: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3250: 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77  te3ExprSpan(pNew
3260: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
3270: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
3280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3290: 28 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ( pRight->flags 
32a0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
32b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
32c0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
32d0: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
32e0: 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
32f0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
3300: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3310: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
3320: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
3330: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
3340: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3350: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e  ollate;.      pN
3360: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66  ew->pColl = pLef
3370: 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  t->pColl;.    }.
3380: 20 20 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65    }..  exprSetHe
3390: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
33a0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
33b0: 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  .** Works like s
33c0: 71 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63  qlite3Expr() exc
33d0: 65 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65  ept that it take
33e0: 73 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65  s an extra Parse
33f0: 2a 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e  *.** argument an
3400: 64 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61  d notifies the a
3410: 73 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63  ssociated connec
3420: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d  tion object if m
3430: 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
3440: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
3450: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
3460: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
3470: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3480: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
34b0: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
34c0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
34d0: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
34e0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
34f0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
3500: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
3510: 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  .  const Token *
3520: 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72  pToken     /* Ar
3530: 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  gument token */.
3540: 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73  ){.  Expr *p = s
3550: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
3560: 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74  e->db, op, pLeft
3570: 2c 20 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e  , pRight, pToken
3580: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3590: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65    sqlite3ExprChe
35a0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
35b0: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
35c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
35d0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
35e0: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
35f0: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
3600: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
3610: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
3620: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
3630: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
3640: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
3650: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
3660: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
3670: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
3680: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
3690: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
36a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
36b0: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
36c0: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
36d0: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
36e0: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
36f0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
3700: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
3710: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
3720: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
3730: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
3740: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
3750: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
3760: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
3770: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
3780: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
3790: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
37a0: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
37b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
37c0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
37d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
37e0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
37f0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3800: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
3810: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3820: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
3830: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
3840: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
3850: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3860: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
3870: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
3880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
3890: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
38a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
38b0: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
38c0: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
38d0: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
38e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
38f0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
3900: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
3910: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
3920: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
3930: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
3940: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
3950: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
3960: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
3970: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
3980: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
3990: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
39a0: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
39b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
39c0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
39d0: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
39e0: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
39f0: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
3a00: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
3a10: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
3a20: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
3a30: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
3a40: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
3a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3a60: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
3a70: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
3a80: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
3a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3aa0: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
3ab0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
3ac0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
3ad0: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
3ae0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
3af0: 76 65 6e 20 74 6f 6b 65 6e 73 2e 20 20 42 6f 74  ven tokens.  Bot
3b00: 68 20 74 6f 6b 65 6e 73 20 6d 75 73 74 20 62 65  h tokens must be
3b10: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20   pointing.** at 
3b20: 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 2e  the same string.
3b30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b40: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
3b50: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
3b60: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
3b70: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52  t){.  assert( pR
3b80: 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  ight!=0 );.  ass
3b90: 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b  ert( pLeft!=0 );
3ba0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
3bb0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
3bc0: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
3bd0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20    pExpr->span.n 
3be0: 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70  = pRight->n + (p
3bf0: 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74  Right->z - pLeft
3c00: 2d 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->z);.  }.}../*.
3c10: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
3c20: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
3c30: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
3c40: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
3c50: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
3c60: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
3c70: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
3c80: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
3c90: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
3ca0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
3cb0: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
3cc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
3cd0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
3ce0: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
3cf0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3d00: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
3d10: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
3d20: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
3d30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3d40: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
3d50: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
3d60: 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61  g memory when ma
3d70: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
3d80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3d90: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
3da0: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77  FUNCTION;.  pNew
3db0: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
3dc0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  t;.  assert( !Ex
3dd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
3de0: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
3df0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3e00: 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b  Token->dyn==0 );
3e10: 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d  .  pNew->token =
3e20: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77   *pToken;.  pNew
3e30: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
3e40: 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33  oken;..  sqlite3
3e50: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50  ExprSetHeight(pP
3e60: 61 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72  arse, pNew);.  r
3e70: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
3e80: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
3e90: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
3ea0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
3eb0: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
3ec0: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
3ed0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
3ee0: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
3ef0: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
3f00: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
3f10: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
3f20: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
3f30: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
3f40: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
3f50: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
3f60: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
3f70: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
3f80: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
3f90: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
3fa0: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
3fb0: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
3fc0: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
3fd0: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
3fe0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
3ff0: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
4000: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
4010: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
4020: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
4030: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
4040: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4050: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
4060: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
4070: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
4080: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
4090: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
40a0: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
40b0: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
40c0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
40d0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
40e0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
40f0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4100: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
4110: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
4120: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4130: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
4140: 6b 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ken;.  sqlite3 *
4150: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4160: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
4170: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f   ) return;.  pTo
4180: 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f  ken = &pExpr->to
4190: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ken;.  assert( p
41a0: 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20  Token->n>=1 );. 
41b0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
41c0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  >z!=0 );.  asser
41d0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21  t( pToken->z[0]!
41e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
41f0: 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  en->n==1 ){.    
4200: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
4210: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
4220: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
4230: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4240: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
4250: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
4260: 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Var;.  }else if(
4270: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27   pToken->z[0]=='
4280: 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  ?' ){.    /* Wil
4290: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
42a0: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
42b0: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
42c0: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a  nteger and.    *
42d0: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
42e0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
42f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
4300: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
4310: 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72  = i = atoi((char
4320: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
4330: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
4340: 69 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  i==0 );.    test
4350: 63 61 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20  case( i==1 );.  
4360: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64    testcase( i==d
4370: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4380: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4390: 4e 55 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20  NUMBER]-1 );.   
43a0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
43b0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
43c0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
43d0: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66  UMBER] );.    if
43e0: 28 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61  ( i<1 || i>db->a
43f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
4410: 45 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ER] ){.      sql
4420: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4430: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
4440: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
4450: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
4460: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  ",.          db-
4470: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4480: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4490: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  MBER]);.    }.  
44a0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
44b0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nVar ){.      pP
44c0: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a  arse->nVar = i;.
44d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
44e0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
44f0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61  of the form ":aa
4500: 61 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52  a" or "$aaa".  R
4510: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
4520: 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75  riable.    ** nu
4530: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
4540: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
4550: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
4560: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
4570: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
4580: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
4590: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
45a0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
45b0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b     */.    int i;
45c0: 0a 20 20 20 20 75 33 32 20 6e 3b 0a 20 20 20 20  .    u32 n;.    
45d0: 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20  n = pToken->n;. 
45e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
45f0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
4600: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
4610: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
4620: 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  (pE = pParse->ap
4630: 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20  VarExpr[i])!=0. 
4640: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
4650: 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20  token.n==n.     
4660: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
4670: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b  E->token.z, pTok
4680: 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  en->z, n)==0 ){.
4690: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
46a0: 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62  Table = pE->iTab
46b0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  le;.        brea
46c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
46d0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72  .    if( i>=pPar
46e0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a  se->nVarExpr ){.
46f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4700: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
4710: 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20  nVar;.      if( 
4720: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
4730: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
4740: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
4750: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4760: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
4770: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4780: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
4790: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
47a0: 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
47b0: 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
47c0: 6f 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20  ocOrFree(.      
47d0: 20 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20          db,.    
47e0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
47f0: 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20  ->apVarExpr,.   
4800: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
4810: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
4820: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
4830: 61 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20  apVarExpr[0]).  
4840: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
4850: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
4860: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4870: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
4880: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
4890: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
48a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
48b0: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
48c0: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
48d0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
48e0: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
48f0: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
4900: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
4910: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
4920: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
4930: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
4940: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4950: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
4960: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
4970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
4980: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74  an expression st
4990: 72 75 63 74 75 72 65 20 77 69 74 68 6f 75 74 20  ructure without 
49a0: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 73 74 72  deleting the str
49b0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a  ucture itself..*
49c0: 2a 20 53 75 62 73 74 72 75 63 74 75 72 65 20 69  * Substructure i
49d0: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 76 6f  s deleted..*/.vo
49e0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  id sqlite3ExprCl
49f0: 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
4a00: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
4a10: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20   p->token.dyn ) 
4a20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4a30: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  , (char*)p->toke
4a40: 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 21 45 78 70  n.z);.  if( !Exp
4a50: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
4a60: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
4a70: 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29 7b 0a  EP_SpanOnly) ){.
4a80: 20 20 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e      if( p->span.
4a90: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46  dyn ) sqlite3DbF
4aa0: 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70  ree(db, (char*)p
4ab0: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 69  ->span.z);.    i
4ac0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4ad0: 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65 64  ty(p, EP_Reduced
4ae0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
4af0: 2d 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65  ->pLeft ) sqlite
4b00: 33 45 78 70 72 43 6c 65 61 72 28 64 62 2c 20 70  3ExprClear(db, p
4b10: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
4b20: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20  if( p->pRight ) 
4b30: 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
4b40: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4b70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74  ete(db, p->pLeft
4b80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4b90: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4ba0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
4bb0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
4bc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
4bd0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
4be0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
4bf0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
4c00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
4c10: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4c20: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4c30: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
4c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4c50: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
4c60: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
4c70: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
4c80: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
4c90: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
4ca0: 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  b, Expr *p){.  i
4cb0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
4cd0: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
4ce0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4cf0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   p);.}../*.** Th
4d00: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65  e Expr.token fie
4d10: 6c 64 20 6d 69 67 68 74 20 62 65 20 61 20 73 74  ld might be a st
4d20: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61  ring literal tha
4d30: 74 20 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20  t is quoted..** 
4d40: 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68  If so, remove th
4d50: 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  e quotation mark
4d60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4d70: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 73 71  e3DequoteExpr(sq
4d80: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
4d90: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
4da0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c  asAnyProperty(p,
4db0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b   EP_Dequoted) ){
4dc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4dd0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
4de0: 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65  ty(p, EP_Dequote
4df0: 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  d);.  if( p->tok
4e00: 65 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 21 45 78  en.dyn==0 && !Ex
4e10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4e20: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a   EP_Reduced) ){.
4e30: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
4e40: 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b  Copy(db, &p->tok
4e50: 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a  en, &p->token);.
4e60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
4e70: 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  uote((char*)p->t
4e80: 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  oken.z);.}../*.*
4e90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
4ea0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c  ber of bytes all
4eb0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 65  ocated for the e
4ec0: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74  xpression struct
4ed0: 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20 61  ure .** passed a
4ee0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
4ef0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 6c  ment. This is al
4f00: 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50 52  ways one of EXPR
4f10: 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58  _FULLSIZE,.** EX
4f20: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f  PR_REDUCEDSIZE o
4f30: 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  r EXPR_TOKENONLY
4f40: 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
4f50: 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53 69  int exprStructSi
4f60: 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ze(Expr *p){.  i
4f70: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4f80: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
4f90: 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58 50  ly) ) return EXP
4fa0: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b  R_TOKENONLYSIZE;
4fb0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4fc0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 70 61  operty(p, EP_Spa
4fd0: 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  nOnly) ) return 
4fe0: 45 58 50 52 5f 53 50 41 4e 4f 4e 4c 59 53 49 5a  EXPR_SPANONLYSIZ
4ff0: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
5000: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5010: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5020: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5030: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
5040: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
5050: 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44  .** sqlite3ExprD
5060: 75 70 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  up() has been ca
5070: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
5080: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
5090: 69 6f 6e 20 70 20 77 69 74 68 0a 2a 2a 20 74 68  ion p with.** th
50a0: 65 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  e EXPRDUP_XXX fl
50b0: 61 67 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ags passed as th
50c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
50d0: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
50e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65   .** returns the
50f0: 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
5100: 66 6f 72 20 74 68 65 20 63 6f 70 79 20 6f 66 20  for the copy of 
5110: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5120: 72 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 69 73  re only..** This
5130: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5140: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5150: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
5160: 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  E or EXPR_TOKENO
5170: 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  NLYSIZE..*/.stat
5180: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
5190: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
51a0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
51b0: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 69    int nSize;.  i
51c0: 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50  f( 0==(flags&EXP
51d0: 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a  RDUP_REDUCE) ){.
51e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
51f0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c  _FULLSIZE;.  }el
5200: 73 65 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  se if( p->pLeft 
5210: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 20 7c 7c 20  || p->pRight || 
5220: 70 2d 3e 70 43 6f 6c 6c 20 7c 7c 20 70 2d 3e 78  p->pColl || p->x
5230: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 53  .pList ){.    nS
5240: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
5250: 45 44 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 20  EDSIZE;.  }else 
5260: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
5270: 50 5f 53 50 41 4e 20 29 7b 0a 20 20 20 20 6e 53  P_SPAN ){.    nS
5280: 69 7a 65 20 3d 20 45 58 50 52 5f 53 50 41 4e 4f  ize = EXPR_SPANO
5290: 4e 4c 59 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  NLYSIZE;.  }else
52a0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58  {.    nSize = EX
52b0: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
52c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
52d0: 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73  Size;.}../*.** s
52e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20  qlite3ExprDup() 
52f0: 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
5300: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70 79  to create a copy
5310: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70   of expression p
5320: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 45 58 50   with.** the EXP
5330: 52 44 55 50 5f 58 58 58 20 70 61 73 73 65 64 20  RDUP_XXX passed 
5340: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
5350: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  gument. This fun
5360: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
5370: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
5380: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
5390: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
53a0: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
53b0: 74 75 72 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ture.** and the 
53c0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 45 78  copies of the Ex
53d0: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 61 6e 64 20 45  pr.token.z and E
53e0: 78 70 72 2e 73 70 61 6e 2e 7a 20 28 69 66 20 61  xpr.span.z (if a
53f0: 70 70 6c 69 63 61 62 6c 65 29 0a 2a 2a 20 73 74  pplicable).** st
5400: 72 69 6e 67 20 62 75 66 66 65 72 73 2e 0a 2a 2f  ring buffers..*/
5410: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
5420: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
5430: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5440: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5450: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5460: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 2b  Size(p, flags) +
5470: 20 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 3f 20 70   (p->token.z ? p
5480: 2d 3e 74 6f 6b 65 6e 2e 6e 20 2b 20 31 20 3a 20  ->token.n + 1 : 
5490: 30 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26  0);.  if( flags&
54a0: 45 58 50 52 44 55 50 5f 53 50 41 4e 20 26 26 20  EXPRDUP_SPAN && 
54b0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 70 2d 3e  (p->token.z!=p->
54c0: 73 70 61 6e 2e 7a 20 7c 7c 20 70 2d 3e 74 6f 6b  span.z || p->tok
54d0: 65 6e 2e 6e 21 3d 70 2d 3e 73 70 61 6e 2e 6e 29  en.n!=p->span.n)
54e0: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
54f0: 20 70 2d 3e 73 70 61 6e 2e 6e 3b 0a 20 20 7d 0a   p->span.n;.  }.
5500: 20 20 72 65 74 75 72 6e 20 28 6e 42 79 74 65 2b    return (nByte+
5510: 37 29 26 7e 37 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  7)&~7;.}../*.** 
5520: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5530: 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
5540: 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  red to create a 
5550: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
5560: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
5570: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5580: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
5590: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
55a0: 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63  t is a.** mask c
55b0: 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55  ontaining EXPRDU
55c0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a  P_XXX flags..**.
55d0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
55e0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73  urned includes s
55f0: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
5600: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
5610: 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65  r struct.** itse
5620: 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65  lf and the buffe
5630: 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79  r referred to by
5640: 20 45 78 70 72 2e 74 6f 6b 65 6e 2c 20 69 66 20   Expr.token, if 
5650: 61 6e 79 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  any. If the .** 
5660: 45 58 50 52 44 55 50 5f 53 50 41 4e 20 66 6c 61  EXPRDUP_SPAN fla
5670: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 73  g is set, then s
5680: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
5690: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 66   copy of the buf
56a0: 66 65 72 0a 2a 2a 20 72 65 66 65 72 65 64 20 74  fer.** refered t
56b0: 6f 20 62 79 20 45 78 70 72 2e 73 70 61 6e 20 69  o by Expr.span i
56c0: 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65 64 2e  s also included.
56d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  .**.** If the EX
56e0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
56f0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
5700: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
5710: 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61  includes .** spa
5720: 63 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20  ce to duplicate 
5730: 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69  all Expr nodes i
5740: 6e 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65  n the tree forme
5750: 64 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20  d by Expr.pLeft 
5760: 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69  .** and Expr.pRi
5770: 67 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62  ght variables (b
5780: 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73  ut not for any s
5790: 74 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65  tructures pointe
57a0: 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63  d to or .** desc
57b0: 65 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45  ended from the E
57c0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45  xpr.x.pList or E
57d0: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61  xpr.x.pSelect va
57e0: 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61  riables)..*/.sta
57f0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5800: 72 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69  rSize(Expr *p, i
5810: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
5820: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66   nByte = 0;.  if
5830: 28 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  ( p ){.    nByte
5840: 20 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65   = dupedExprNode
5850: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
5860: 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58      if( flags&EX
5870: 50 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a  PRDUP_REDUCE ){.
5880: 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c        int f = fl
5890: 61 67 73 26 28 7e 45 58 50 52 44 55 50 5f 53 50  ags&(~EXPRDUP_SP
58a0: 41 4e 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  AN);.      nByte
58b0: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a   += dupedExprSiz
58c0: 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 29 20 2b  e(p->pLeft, f) +
58d0: 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 70   dupedExprSize(p
58e0: 2d 3e 70 52 69 67 68 74 2c 20 66 29 3b 0a 20 20  ->pRight, f);.  
58f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5900: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
5910: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5920: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
5930: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
5940: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
5950: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
5960: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
5970: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
5980: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
5990: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
59a0: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
59b0: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
59c0: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
59d0: 70 69 65 73 20 6f 66 20 70 2d 3e 74 6f 6b 65 6e  pies of p->token
59e0: 20 61 6e 64 20 70 2d 3e 73 70 61 6e 20 0a 2a 2a   and p->span .**
59f0: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
5a00: 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73  , and the copies
5a10: 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74   of the p->pLeft
5a20: 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65   and p->pRight e
5a30: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69  xpressions,.** i
5a40: 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65  f any. Before re
5a50: 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66  turning, *pzBuff
5a60: 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  er is set to the
5a70: 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73   first byte pass
5a80: 65 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f  ed the.** portio
5a90: 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  n of the buffer 
5aa0: 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74  copied into by t
5ab0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
5ac0: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78  .static Expr *ex
5ad0: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
5ae0: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
5af0: 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75  flags, u8 **pzBu
5b00: 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70  ffer){.  Expr *p
5b10: 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5b30: 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
5b40: 20 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   */.  if( p ){. 
5b50: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52     const int isR
5b60: 65 71 75 69 72 65 53 70 61 6e 20 3d 20 28 66 6c  equireSpan = (fl
5b70: 61 67 73 26 45 58 50 52 44 55 50 5f 53 50 41 4e  ags&EXPRDUP_SPAN
5b80: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  );.    const int
5b90: 20 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c   isReduced = (fl
5ba0: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
5bb0: 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c  CE);.    u8 *zAl
5bc0: 6c 6f 63 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  loc;..    assert
5bd0: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
5be0: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
5bf0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
5c00: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
5c10: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
5c20: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
5c30: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
5c40: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
5c50: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 7d 65 6c  zBuffer;.    }el
5c60: 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63  se{.      zAlloc
5c70: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5c80: 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64 45  ocRaw(db, dupedE
5c90: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
5ca0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
5cb0: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
5cc0: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
5cd0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
5ce0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
5cf0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
5d00: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
5d10: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
5d20: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
5d30: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
5d40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
5d50: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
5d60: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
5d70: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
5d80: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
5d90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5da0: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
5db0: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
5dc0: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 74 6f 6b  py of the p->tok
5dd0: 65 6e 2e 7a 20 73 74 72 69 6e 67 20 28 69 66 20  en.z string (if 
5de0: 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
5df0: 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
5e00: 4e 65 77 53 69 7a 65 20 3d 20 64 75 70 65 64 45  NewSize = dupedE
5e10: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
5e20: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63   flags);.      c
5e30: 6f 6e 73 74 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  onst int nToken 
5e40: 3d 20 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 3f 20  = (p->token.z ? 
5e50: 70 2d 3e 74 6f 6b 65 6e 2e 6e 20 2b 20 31 20 3a  p->token.n + 1 :
5e60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   0);.      if( i
5e70: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
5e80: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
5e90: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5ea0: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
5eb0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5ec0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
5ed0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
5ee0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
5ef0: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
5f00: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
5f10: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
5f20: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
5f30: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
5f40: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
5f50: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
5f60: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
5f70: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
5f80: 5f 52 65 64 75 63 65 64 20 61 6e 64 20 45 50 5f  _Reduced and EP_
5f90: 54 6f 6b 65 6e 4f 6e 6c 79 20 66 6c 61 67 73 20  TokenOnly flags 
5fa0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
5fb0: 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  /.      pNew->fl
5fc0: 61 67 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75  ags &= ~(EP_Redu
5fd0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
5fe0: 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 3b 0a 20  |EP_SpanOnly);. 
5ff0: 20 20 20 20 20 73 77 69 74 63 68 28 20 6e 4e 65       switch( nNe
6000: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
6010: 20 63 61 73 65 20 45 58 50 52 5f 52 45 44 55 43   case EXPR_REDUC
6020: 45 44 53 49 5a 45 3a 20 20 20 70 4e 65 77 2d 3e  EDSIZE:   pNew->
6030: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 52 65 64 75  flags |= EP_Redu
6040: 63 65 64 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ced; break;.    
6050: 20 20 20 20 63 61 73 65 20 45 58 50 52 5f 54 4f      case EXPR_TO
6060: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3a 20 70 4e 65  KENONLYSIZE: pNe
6070: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 54  w->flags |= EP_T
6080: 6f 6b 65 6e 4f 6e 6c 79 3b 20 62 72 65 61 6b 3b  okenOnly; break;
6090: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 45 58  .        case EX
60a0: 50 52 5f 53 50 41 4e 4f 4e 4c 59 53 49 5a 45 3a  PR_SPANONLYSIZE:
60b0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
60c0: 20 45 50 5f 53 70 61 6e 4f 6e 6c 79 3b 20 62 72   EP_SpanOnly; br
60d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
60e0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
60f0: 70 2d 3e 74 6f 6b 65 6e 20 73 74 72 69 6e 67 2c  p->token string,
6100: 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
6110: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
6120: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
6130: 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20   char *zToken = 
6140: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
6150: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
6160: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 74 6f 6b  y(zToken, p->tok
6170: 65 6e 2e 7a 2c 20 6e 54 6f 6b 65 6e 2d 31 29 3b  en.z, nToken-1);
6180: 0a 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e 5b  .        zToken[
6190: 6e 54 6f 6b 65 6e 2d 31 5d 20 3d 20 27 5c 30 27  nToken-1] = '\0'
61a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
61b0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
61c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b         pNew->tok
61d0: 65 6e 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20  en.z = zToken;. 
61e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
61f0: 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c  ( 0==((p->flags|
6200: 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 45  pNew->flags) & E
6210: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
6220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6230: 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 73 70 61  in the pNew->spa
6240: 6e 20 74 6f 6b 65 6e 2c 20 69 66 20 72 65 71 75  n token, if requ
6250: 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
6260: 20 69 66 28 20 69 73 52 65 71 75 69 72 65 53 70   if( isRequireSp
6270: 61 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  an ){.          
6280: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d  if( p->token.z!=
6290: 70 2d 3e 73 70 61 6e 2e 7a 20 7c 7c 20 70 2d 3e  p->span.z || p->
62a0: 74 6f 6b 65 6e 2e 6e 21 3d 70 2d 3e 73 70 61 6e  token.n!=p->span
62b0: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .n ){.          
62c0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d    pNew->span.z =
62d0: 20 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a   &zAlloc[nNewSiz
62e0: 65 2b 6e 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 20  e+nToken];.     
62f0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 28 63         memcpy((c
6300: 68 61 72 20 2a 29 70 4e 65 77 2d 3e 73 70 61 6e  har *)pNew->span
6310: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  .z, p->span.z, p
6320: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
6330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70 61         pNew->spa
6340: 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
6350: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6360: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70          pNew->sp
6370: 61 6e 2e 7a 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  an.z = pNew->tok
6380: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  en.z;.          
6390: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 6e 20 3d    pNew->span.n =
63a0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a   pNew->token.n;.
63b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
63c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63d0: 20 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e       pNew->span.
63e0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
63f0: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 6e 20 3d 20   pNew->span.n = 
6400: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6410: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6420: 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e  0==((p->flags|pN
6430: 65 77 2d 3e 66 6c 61 67 73 29 20 26 20 28 45 50  ew->flags) & (EP
6440: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 70  _TokenOnly|EP_Sp
6450: 61 6e 4f 6e 6c 79 29 29 20 29 7b 0a 20 20 20 20  anOnly)) ){.    
6460: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
6470: 68 65 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65  he pNew->x.pSele
6480: 63 74 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c  ct or pNew->x.pL
6490: 69 73 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20  ist member. */. 
64a0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
64b0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
64c0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
64d0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78           pNew->x
64e0: 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  .pSelect = sqlit
64f0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
6500: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73  p->x.pSelect, is
6510: 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20  Reduced);.      
6520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6530: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74     pNew->x.pList
6540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6550: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  stDup(db, p->x.p
6560: 4c 69 73 74 2c 20 69 73 52 65 64 75 63 65 64 29  List, isReduced)
6570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6580: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
6590: 6c 6c 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66  ll in pNew->pLef
65a0: 74 20 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67  t and pNew->pRig
65b0: 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ht. */.      if(
65c0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
65d0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64  rty(pNew, EP_Red
65e0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
65f0: 79 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29  y|EP_SpanOnly) )
6600: 7b 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63  {.        zAlloc
6610: 20 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64   += dupedExprNod
6620: 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b  eSize(p, flags);
6630: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
6640: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
6650: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  w, EP_Reduced) )
6660: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
6670: 2d 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75  ->pLeft = exprDu
6680: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
6690: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
66a0: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
66b0: 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74      pNew->pRight
66c0: 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   = exprDup(db, p
66d0: 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55  ->pRight, EXPRDU
66e0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
66f0: 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
6700: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
6710: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
6720: 2a 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c  *pzBuffer = zAll
6730: 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  oc;.        }.  
6740: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 45      }else if( !E
6750: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
6760: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
6770: 79 7c 45 50 5f 53 70 61 6e 4f 6e 6c 79 29 20 29  y|EP_SpanOnly) )
6780: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
6790: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
67a0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
67b0: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eft, 0);.       
67c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
67d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
67e0: 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29  b, p->pRight, 0)
67f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
6810: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  w;.}../*.** The 
6820: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
6830: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
6840: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
6850: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6860: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
6870: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
6880: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
6890: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
68a0: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
68b0: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
68c0: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
68d0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
68e0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
68f0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
6900: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
6910: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
6920: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
6930: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
6940: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
6950: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
6960: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
6970: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
6980: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
6990: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
69a0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
69b0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
69c0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
69d0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
69e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
69f0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
6a00: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
6a10: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
6a20: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
6a30: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
6a40: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
6a50: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
6a60: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
6a70: 67 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 45 58  gs. If.** the EX
6a80: 50 52 44 55 50 5f 53 50 41 4e 20 66 6c 61 67 20  PRDUP_SPAN flag 
6a90: 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 61 72  is set in the ar
6aa0: 67 75 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  gument parameter
6ab0: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 45  , then the .** E
6ac0: 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f  xpr.span field o
6ad0: 66 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  f the input expr
6ae0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 70 69 65 64  ession is copied
6af0: 2e 20 49 66 20 45 58 50 52 44 55 50 5f 53 50 41  . If EXPRDUP_SPA
6b00: 4e 20 69 73 0a 2a 2a 20 63 6c 65 61 72 2c 20 74  N is.** clear, t
6b10: 68 65 6e 20 74 68 65 20 45 78 70 72 2e 73 70 61  hen the Expr.spa
6b20: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 72  n field of the r
6b30: 65 74 75 72 6e 65 64 20 65 78 70 72 65 73 73 69  eturned expressi
6b40: 6f 6e 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  on structure.** 
6b50: 69 73 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  is zeroed..**.**
6b60: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
6b70: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
6b80: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
6b90: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
6ba0: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
6bb0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
6bc0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
6bd0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
6be0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
6bf0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
6c00: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
6c10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
6c20: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
6c30: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
6c40: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
6c50: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
6c60: 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20  lags){.  return 
6c70: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
6c80: 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 76 6f 69 64  lags, 0);.}.void
6c90: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
6ca0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  y(sqlite3 *db, T
6cb0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
6cc0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
6cd0: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
6ce0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68  e3DbFree(db, (ch
6cf0: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
6d00: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
6d10: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
6d20: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
6d30: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
6d40: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
6d50: 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  ar*)pFrom->z, pF
6d60: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
6d70: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
6d80: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
6d90: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
6da0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
6db0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
6dc0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c  db, ExprList *p,
6dd0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45   int flags){.  E
6de0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
6df0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6e00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
6e10: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
6e20: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
6e30: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
6e40: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6e50: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
6e60: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
6e70: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
6e80: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75   0;.  pNew->iECu
6e90: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rsor = 0;.  pNew
6ea0: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
6eb0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
6ec0: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
6ed0: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Item = sqlite3Db
6ee0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70  MallocRaw(db,  p
6ef0: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
6f00: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
6f10: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
6f20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6f30: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  b, pNew);.    re
6f40: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
6f50: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
6f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
6f70: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6f80: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
6f90: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
6fa0: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
6fb0: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
6fc0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
6fd0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
6fe0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
6ff0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
7000: 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20  dExpr, flags);. 
7010: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
7020: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7030: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7040: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
7050: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
7060: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
7070: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
7080: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
7090: 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70 4f 6c 64 49  em->iCol = pOldI
70a0: 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20 20 20 20 70  tem->iCol;.    p
70b0: 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 70  Item->iAlias = p
70c0: 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c 69 61 73 3b  OldItem->iAlias;
70d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
70e0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
70f0: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
7100: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
7110: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
7120: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
7130: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
7140: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
7150: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
7160: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
7170: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7180: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
7190: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
71a0: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
71b0: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
71c0: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
71d0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
71e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
71f0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
7200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7210: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
7220: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7230: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
7240: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
7250: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
7260: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
7270: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
7280: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
7290: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
72a0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
72b0: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
72c0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
72d0: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
72e0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
72f0: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
7300: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7310: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
7320: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
7330: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
7340: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20  0;.  pNew->nSrc 
7350: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
7360: 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28   p->nSrc;.  for(
7370: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20  i=0; i<p->nSrc; 
7380: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
7390: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
73a0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
73b0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
73c0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
73d0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
73e0: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
73f0: 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  pTab;.    pNewIt
7400: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
7410: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7420: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
7430: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
7440: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
7450: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7460: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
7470: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
7480: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
7490: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
74a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
74b0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
74c0: 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c  ->jointype = pOl
74d0: 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  dItem->jointype;
74e0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
74f0: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
7500: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
7510: 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75  pNewItem->isPopu
7520: 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lated = pOldItem
7530: 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20  ->isPopulated;. 
7540: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e     pNewItem->zIn
7550: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dex = sqlite3DbS
7560: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7570: 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20  em->zIndex);.   
7580: 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pNewItem->notIn
7590: 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  dexed = pOldItem
75a0: 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20  ->notIndexed;.  
75b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64    pNewItem->pInd
75c0: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
75d0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 20  Index;.    pTab 
75e0: 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  = pNewItem->pTab
75f0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61   = pOldItem->pTa
7600: 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  b;.    if( pTab 
7610: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  ){.      pTab->n
7620: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
7630: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65   pNewItem->pSele
7640: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
7650: 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  ctDup(db, pOldIt
7660: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61  em->pSelect, fla
7670: 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  gs);.    pNewIte
7680: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
7690: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
76a0: 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73  Item->pOn, flags
76b0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
76c0: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
76d0: 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70  3IdListDup(db, p
76e0: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
76f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
7700: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
7710: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
7720: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7730: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
7740: 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74  3IdListDup(sqlit
7750: 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
7760: 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e  p){.  IdList *pN
7770: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
7780: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7790: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
77a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
77b0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
77c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
77d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
77e0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
77f0: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
7800: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
7810: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7820: 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69  aw(db, p->nId*si
7830: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
7840: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
7850: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7860: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
7870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7880: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
7890: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
78a0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
78b0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
78c0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
78d0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
78e0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
78f0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
7900: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
7910: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7920: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
7930: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
7940: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
7950: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
7960: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
7970: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
7980: 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33  electDup(sqlite3
7990: 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c   *db, Select *p,
79a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53   int flags){.  S
79b0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
79c0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
79d0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
79e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
79f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
7a00: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
7a10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a  ) return 0;.  /*
7a20: 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63   Always make a c
7a30: 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20  opy of the span 
7a40: 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78  for top-level ex
7a50: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
7a60: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
7a70: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
7a80: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
7a90: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
7aa0: 72 6d 69 6e 65 73 0a 20 20 2a 2a 20 74 68 65 20  rmines.  ** the 
7ab0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
7ac0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7ad0: 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e  et needs this in
7ae0: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 70  formation */.  p
7af0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
7b00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7b10: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
7b20: 66 6c 61 67 73 7c 45 58 50 52 44 55 50 5f 53 50  flags|EXPRDUP_SP
7b30: 41 4e 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  AN);.  pNew->pSr
7b40: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
7b50: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
7b60: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
7b70: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
7b80: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7b90: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
7ba0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
7bb0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
7bc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
7bd0: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
7be0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
7bf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7c00: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
7c10: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7c20: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
7c30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7c40: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
7c50: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7c60: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
7c70: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
7c80: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
7c90: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c  b, p->pPrior, fl
7ca0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ags);.  pNew->pL
7cb0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
7cc0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
7cd0: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
7ce0: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
7cf0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7d00: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
7d10: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
7d20: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
7d30: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
7d40: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
7d50: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
7d60: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
7d70: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  l;.  pNew->pRigh
7d80: 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65  tmost = 0;.  pNe
7d90: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
7da0: 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  0] = -1;.  pNew-
7db0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
7dc0: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
7dd0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
7de0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e   -1;.  return pN
7df0: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
7e00: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
7e10: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
7e20: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
7e30: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
7e40: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
7e50: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
7e60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
7e70: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
7e80: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
7e90: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
7ea0: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
7eb0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
7ec0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
7ed0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
7ee0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
7ef0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7f00: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
7f10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
7f20: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7f30: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7f40: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
7f50: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
7f60: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
7f70: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
7f80: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
7f90: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
7fa0: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
7fb0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
7fc0: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me            /*
7fd0: 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20   AS keyword for 
7fe0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  the expression *
7ff0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
8000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8010: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8020: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
8030: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8040: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
8050: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
8060: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8070: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
8080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
8090: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
80a0: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
80b0: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
80c0: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
80d0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
80e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
80f0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
8100: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
8110: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
8120: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
8130: 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70  t->a, n*sizeof(p
8140: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
8150: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
8160: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8170: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
8180: 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69  ->a = a;.    pLi
8190: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c  st->nAlloc = sql
81a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
81b0: 28 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61  (db, a)/sizeof(a
81c0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [0]);.  }.  asse
81d0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
81e0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
81f0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
8200: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8210: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
8220: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
8230: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
8240: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
8250: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
8260: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8270: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8280: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
8290: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
82a0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
82b0: 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
82c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
82d0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
82e0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
82f0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
8300: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
8310: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
8320: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8330: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
8340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8350: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
8360: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8370: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
8380: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
8390: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
83a0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
83b0: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
83c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
83d0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
83e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
83f0: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
8400: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
8410: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
8420: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8430: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
8440: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
8450: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8460: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
8470: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
8480: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
8490: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
84a0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
84b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
84c0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
84d0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
84e0: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
84f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8500: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8510: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
8520: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
8530: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
8540: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
8550: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
8560: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8570: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
8580: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
8590: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
85a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
85b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
85c0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
85d0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
85e0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
85f0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30  (pList->nExpr==0
8600: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   && pList->nAllo
8610: 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  c==0) );.  asser
8620: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  t( pList->nExpr<
8630: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
8640: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
8650: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
8660: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8670: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
8680: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8690: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
86a0: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
86b0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
86c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
86d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
86e0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
86f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8700: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
8710: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
8720: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
8730: 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75  backs.  Walker.u
8740: 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72  .pi is a pointer
8750: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
8760: 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  r.  These routin
8770: 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20  es are checking 
8780: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
8790: 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73   see.** if it is
87a0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65   a constant.  Se
87b0: 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74  t *Walker.u.pi t
87c0: 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65  o 0 if the expre
87d0: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ssion is.** not 
87e0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
87f0: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
8800: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
8810: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
8820: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
8830: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
8840: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a  prIsConstant().*
8850: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
8860: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
8870: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  in().**     sqli
8880: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8890: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a  tOrFunction().**
88a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
88b0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
88c0: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
88d0: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
88e0: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
88f0: 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e  r->u.i is 3 then
8900: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
8910: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
8920: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
8930: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
8940: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
8950: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
8960: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
8970: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
8980: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
8990: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
89a0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20  lker->u.i==3 && 
89b0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
89c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
89d0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
89e0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
89f0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
8a00: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
8a10: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8a20: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
8a30: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
8a40: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
8a50: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
8a60: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
8a70: 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65     ** and pWalke
8a80: 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20  r->u.i==2 */.   
8a90: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
8aa0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
8ab0: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72  lker->u.i==2 ) r
8ac0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
8ad0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
8ae0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8af0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
8b00: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
8b10: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
8b20: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
8b30: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
8b40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
8b50: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
8b60: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
8b70: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
8b80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8b90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
8ba0: 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
8bb0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
8bc0: 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e  TK_EXISTS );.#en
8bd0: 64 69 66 0a 20 20 20 20 20 20 74 65 73 74 63 61  dif.      testca
8be0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8bf0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
8c00: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8c10: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
8c20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8c30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
8c40: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
8c50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8c60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
8c70: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
8c80: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
8c90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
8ca0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65  RC_Abort;.    de
8cb0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
8cc0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
8cd0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69  ;.  }.}.static i
8ce0: 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  nt selectNodeIsC
8cf0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
8d00: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
8d10: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
8d20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
8d30: 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65  tUsed);.  pWalke
8d40: 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65  r->u.i = 0;.  re
8d50: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
8d60: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
8d70: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
8d80: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b  , int initFlag){
8d90: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
8da0: 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b  .u.i = initFlag;
8db0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
8dc0: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
8dd0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
8de0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
8df0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
8e00: 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ant;.  sqlite3Wa
8e10: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
8e20: 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d   return w.u.i;.}
8e30: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
8e40: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8e50: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
8e60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8e70: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
8e80: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
8e90: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
8ea0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
8eb0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
8ec0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
8ed0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
8ee0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
8ef0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
8f00: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
8f10: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
8f20: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
8f30: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
8f40: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
8f50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
8f60: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
8f70: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
8f80: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29  xprIsConst(p, 1)
8f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
8fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
8fb0: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
8fc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8fd0: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74  is constant.** t
8fe0: 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67  hat does no orig
8ff0: 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f  inate from the O
9000: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
9010: 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  es of a join..**
9020: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9030: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
9040: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
9050: 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72  alls or terms fr
9060: 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55  om.** an ON or U
9070: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  SING clause..*/.
9080: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9090: 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
90a0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74  (Expr *p){.  ret
90b0: 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28  urn exprIsConst(
90c0: 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 3);.}../*.** 
90d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
90e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
90f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
9100: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
9110: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
9120: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
9130: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
9140: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
9150: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
9160: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
9170: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
9180: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
9190: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
91a0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
91b0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
91c0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
91d0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
91e0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
91f0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
9200: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
9210: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9220: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
9230: 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  tion(Expr *p){. 
9240: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
9250: 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 2);.}../*
9260: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9270: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
9280: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
9290: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
92a0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
92b0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
92c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
92d0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
92e0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
92f0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
9300: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9310: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
9320: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
9330: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
9340: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
9350: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
9360: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
9370: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
9380: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
9390: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
93a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
93b0: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  lue){.  int rc =
93c0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61   0;.  if( p->fla
93d0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
93e0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
93f0: 3d 20 70 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  = p->iTable;.   
9400: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9410: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
9420: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
9430: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
9440: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e  c = sqlite3GetIn
9450: 74 33 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  t32((char*)p->to
9460: 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 3b 0a  ken.z, pValue);.
9470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9480: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
9490: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63  PLUS: {.      rc
94a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73   = sqlite3ExprIs
94b0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
94c0: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , pValue);.     
94d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
94e0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
94f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
9500: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9510: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
9520: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
9530: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
9540: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
9550: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
9560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9570: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
9580: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
9590: 72 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  rc ){.    p->op 
95a0: 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
95b0: 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50    p->flags |= EP
95c0: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 70  _IntValue;.    p
95d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2a 70 56 61 6c  ->iTable = *pVal
95e0: 75 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ue;.  }.  return
95f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
9600: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
9610: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
9620: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
9630: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
9640: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
9650: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9660: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
9670: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
9680: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
9690: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
96a0: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
96b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
96c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
96d0: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
96e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
96f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9700: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
9710: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
9720: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
9730: 20 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20   enabled and.** 
9740: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9750: 6d 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e  ment p exists an
9760: 64 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73  d is of the.** s
9770: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  imple form:.**.*
9780: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
9790: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
97a0: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e>.**.** If this
97b0: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
97c0: 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
97d0: 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74   to use an exist
97e0: 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20  ing table.** or 
97f0: 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
9800: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65   generating an e
9810: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
9820: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9830: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9840: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
9850: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
9860: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
9870: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
9880: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
9890: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
98a0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
98b0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
98c0: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
98d0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
98e0: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
98f0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
9900: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
9910: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
9920: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
9930: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
9940: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
9950: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
9960: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9970: 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
9980: 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
9990: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
99a0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
99b0: 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
99c0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
99d0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
99e0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
99f0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
9a00: 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a20: 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
9a30: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
9a40: 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
9a50: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   0;.  if( p->pWh
9a60: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a80: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
9a90: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
9aa0: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
9ab0: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
9ac0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
9ad0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
9ae0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
9af0: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
9b00: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
9b10: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
9b20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
9b30: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
9b40: 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  is not a subquer
9b50: 79 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  y */.  pTab = pS
9b60: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
9b70: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
9b80: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
9b90: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72  Tab->pSelect ) r
9ba0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
9bb0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
9bc0: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a   is not a view *
9bd0: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
9be0: 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
9bf0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52   0;        /* FR
9c00: 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20  OM clause not a 
9c10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
9c20: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
9c30: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
9c40: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
9c50: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
9c60: 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e  /* One column in
9c70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9c80: 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  */.  if( pEList-
9c90: 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
9ca0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
9cb0: 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74  urn 0; /* Result
9cc0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   is a column */.
9cd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
9ce0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9cf0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
9d00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9d10: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
9d20: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
9d30: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
9d40: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
9d50: 49 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66  It's job is to f
9d60: 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20  ind or create a 
9d70: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
9d80: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
9d90: 64 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74  d.** either to t
9da0: 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  est for membersh
9db0: 69 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20  ip of the (...) 
9dc0: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
9dd0: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73  e through.** its
9de0: 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69   members, skippi
9df0: 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a  ng duplicates..*
9e00: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
9e10: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74  opened on the st
9e20: 72 75 63 74 75 72 65 20 28 64 61 74 61 62 61 73  ructure (databas
9e30: 65 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73  e table, databas
9e40: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65  e index .** or e
9e50: 70 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69  phermal table) i
9e60: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e  s stored in pX->
9e70: 69 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68  iTable before th
9e80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9e90: 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  rns..** The retu
9ea0: 72 6e 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63  rned value indic
9eb0: 61 74 65 73 20 74 68 65 20 73 74 72 75 63 74 75  ates the structu
9ec0: 72 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c  re type, as foll
9ed0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f  ows:.**.**   IN_
9ee0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68  INDEX_ROWID - Th
9ef0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
9f00: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
9f10: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e  e table..**   IN
9f20: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54  _INDEX_INDEX - T
9f30: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
9f40: 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61  ened on a databa
9f50: 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  se index..**   I
9f60: 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20  N_INDEX_EPH -   
9f70: 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f  The cursor was o
9f80: 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69  pened on a speci
9f90: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64  ally created and
9fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9fb0: 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64         populated
9fc0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
9fd0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
9fe0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6d 61  ing structure ma
9ff0: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69  y only be used i
a000: 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
a010: 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a  of the simple.**
a020: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
a030: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
a040: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
a050: 0a 2a 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e  .** If prNotFoun
a060: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  d parameter is 0
a070: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
a080: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65  ture will be use
a090: 64 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20  d to iterate.** 
a0a0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20  through the set 
a0b0: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
a0c0: 67 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73  g any duplicates
a0d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
a0e0: 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74  n.** epheremal t
a0f0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65  able must be use
a100: 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c  d unless the sel
a110: 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69  ected <column> i
a120: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
a130: 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65  to be unique - e
a140: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74  ither because it
a150: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
a160: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74  RIMARY KEY or it
a170: 0a 2a 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79  .** is unique by
a180: 20 76 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e   virtue of a con
a190: 73 74 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69  straint or impli
a1a0: 63 69 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  cit index..**.**
a1b0: 20 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75   If the prNotFou
a1c0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
a1d0: 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20  not 0, then the 
a1e0: 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62  structure will b
a1f0: 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
a200: 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
a210: 69 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69  ip tests. In thi
a220: 73 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65  s case an ephere
a230: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a  mal table must .
a240: 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73  ** be used unles
a250: 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e  s <column> is an
a260: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a270: 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78   KEY or an index
a280: 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e   can .** be foun
a290: 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20  d with <column> 
a2a0: 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74  as its left-most
a2b0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57   column..**.** W
a2c0: 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hen the structur
a2d0: 65 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  e is being used 
a2e0: 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68  for set membersh
a2f0: 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 75 73  ip tests, the us
a300: 65 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b  er.** needs to k
a310: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
a320: 6f 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ot the structure
a330: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c   contains an SQL
a340: 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20   NULL .** value 
a350: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72  in order to corr
a360: 65 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65  ectly evaluate e
a370: 78 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20  xpressions like 
a380: 22 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a  "X IN (Y, Z)"..*
a390: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
a3a0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
a3b0: 73 74 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f  structure may co
a3c0: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
a3d0: 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
a3e0: 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
a3f0: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
a400: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
a410: 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
a420: 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  * to *prNotFound
a430: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
a440: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
a450: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
a460: 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61  ins a.** NULL va
a470: 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74  lue, then *prNot
a480: 46 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e  Found is left un
a490: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
a4a0: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
a4b0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
a4c0: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
a4d0: 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  d in *prNotFound
a4e0: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e  , then.** its in
a4f0: 69 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e  itial value is N
a500: 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75  ULL. If the stru
a510: 63 74 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72  cture does not r
a520: 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a  emain constant.*
a530: 2a 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69  * for the durati
a540: 6f 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  on of the query 
a550: 28 69 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73  (i.e. the set is
a560: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
a570: 62 2d 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74  b-select), .** t
a580: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
a590: 61 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74  allocated regist
a5a0: 65 72 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e  er is reset to N
a5b0: 55 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68  ULL each time th
a5c0: 65 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  e .** structure 
a5d0: 69 73 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20  is repopulated. 
a5e0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
a5f0: 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64  caller to use vd
a600: 62 65 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69  be code .** equi
a610: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f  valent to the fo
a620: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
a630: 20 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e   if( register==N
a640: 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61  ULL ){.**     ha
a650: 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69  s_null = <test i
a660: 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  f data structure
a670: 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a   contains null>.
a680: 2a 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20  **     register 
a690: 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  = 1.**   }.**.**
a6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
a6b0: 69 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c  id running the <
a6c0: 74 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72  test if data str
a6d0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
a6e0: 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f  null>.** test mo
a6f0: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73  re often than is
a700: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23   necessary..*/.#
a710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a720: 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20  IT_SUBQUERY.int 
a730: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
a740: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
a750: 2c 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20  , Expr *pX, int 
a760: 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20  *prNotFound){.  
a770: 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74  Select *p;.  int
a780: 20 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e   eType = 0;.  in
a790: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
a7a0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d  >nTab++;.  int m
a7b0: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70  ustBeUnique = !p
a7c0: 72 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a  rNotFound;..  /*
a7d0: 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66   The follwing if
a7e0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
a7f0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
a800: 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
a810: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f   .  ** simple fo
a820: 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
a830: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
a840: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20  > FROM <table>. 
a850: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
a860: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
a870: 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
a880: 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74   to use an exist
a890: 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ing table.  ** o
a8a0: 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  r index instead 
a8b0: 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  of generating an
a8c0: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
a8d0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78  ..  */.  p = (Ex
a8e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
a8f0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
a900: 3f 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ? pX->x.pSelect 
a910: 3a 20 30 29 3b 0a 20 20 69 66 28 20 69 73 43 61  : 0);.  if( isCa
a920: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
a930: 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p) ){.    sqlite
a940: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
a950: 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  db;.    Index *p
a960: 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Idx;.    Expr *p
a970: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
a980: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
a990: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
a9a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
a9b0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a9c0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a9d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
a9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
a9f0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f   called from two
aa00: 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68   places. In both
aa10: 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a   cases the vdbe.
aa20: 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
aa30: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
aa40: 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c  d. So assume sql
aa50: 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73  ite3GetVdbe() is
aa60: 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73   always.    ** s
aa70: 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a  uccessful here..
aa80: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
aa90: 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43  t(v);.    if( iC
aaa0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ol<0 ){.      in
aab0: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
aac0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
aad0: 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20  nt iAddr;.      
aae0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
aaf0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
ab00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  ;.      int iDb 
ab10: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ab20: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
ab30: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
ab40: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
ab50: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a  Btree(v, iDb);..
ab60: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
ab70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ab80: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
ab90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aba0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
abb0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
abc0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
abd0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
abe0: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
abf0: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
ac00: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
ac10: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
ac20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac30: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
ac40: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
ac50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
ac60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ac70: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
ac80: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
ac90: 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20  dex is to .     
aca0: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
acb0: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
acc0: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
acd0: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
ace0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
acf0: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
ad00: 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f  quence..      */
ad10: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
ad20: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
ad30: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
ad40: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
ad50: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
ad60: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
ad70: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
ad80: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
ad90: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
ada0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
adb0: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
adc0: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
add0: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
ade0: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
adf0: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
ae00: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
ae10: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
ae20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
ae30: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
ae40: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
ae50: 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63      char aff = c
ae60: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
ae70: 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74  y(pX);.      int
ae80: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28   affinity_ok = (
ae90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
aea0: 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c  .affinity==aff||
aeb0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
aec0: 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f  NONE);..      fo
aed0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
aee0: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
aef0: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
af00: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
af10: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
af20: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
af30: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
af40: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71          && (pReq
af50: 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  ==sqlite3FindCol
af60: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
af70: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
af80: 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20  ], -1, 0)).     
af90: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
afa0: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
afb0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
afc0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
afd0: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
afe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
aff0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
b000: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
b010: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
b020: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
b030: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
b040: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
b050: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
b060: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
b070: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
b080: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44  x);.          iD
b090: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
b0a0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64  aToIndex(db, pId
b0b0: 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  x->pSchema);.   
b0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b0d0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
b0e0: 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Db);..          
b0f0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
b100: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b110: 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  If, iMem);.     
b120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b130: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b140: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
b150: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
b160: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
b170: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
b180: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
b190: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
b1c0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
b1d0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
b1e0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
b1f0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
b200: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
b210: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
b220: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b230: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b240: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
b250: 20 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75      if( prNotFou
b260: 6e 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f  nd && !pTab->aCo
b270: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
b280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
b290: 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70  prNotFound = ++p
b2a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b2b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b2c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b2d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70  .  }..  if( eTyp
b2e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
b2f0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
b300: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
b310: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
b320: 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29  if( prNotFound )
b330: 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f  {.      *prNotFo
b340: 75 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  und = rMayHaveNu
b350: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
b360: 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Mem;.    }else i
b370: 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  f( pX->pLeft->iC
b380: 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72  olumn<0 && !Expr
b390: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
b3a0: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
b3b0: 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20   ){.      eType 
b3c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
b3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b3e0: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
b3f0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
b400: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
b410: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
b420: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b430: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
b440: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
b450: 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eType;.}.#endif.
b460: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b470: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
b480: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
b490: 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  as an expression
b4a0: 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  .** and IN opera
b4b0: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
b4c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
b4d0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
b4e0: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
b4f0: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
b500: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
b510: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
b520: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
b530: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
b540: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
b550: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
b560: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
b570: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
b580: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
b590: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
b5a0: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
b5b0: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
b5c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
b5d0: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
b5e0: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
b5f0: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
b600: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
b610: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
b620: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
b630: 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20  eter isRowid is 
b640: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65  non-zero, then e
b650: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
b660: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
b670: 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f   to be of the fo
b680: 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28  rm "<rowid> IN (
b690: 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65  ?, ?, ?)", where
b6a0: 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65   <rowid> is a re
b6b0: 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f  ference.** to so
b6c0: 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63  me integer key c
b6d0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65  olumn of a table
b6e0: 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73   B-Tree. In this
b6f0: 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a   case, use an.**
b700: 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74   intkey B-Tree t
b710: 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
b720: 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65  of IN(...) value
b730: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  s instead of the
b740: 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65   usual.** (slowe
b750: 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  r) variable leng
b760: 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a  th keys B-Tree..
b770: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b780: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b790: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
b7a0: 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72  Subselect(.  Par
b7b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
b7c0: 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 69  xpr *pExpr, .  i
b7d0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c  nt rMayHaveNull,
b7e0: 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 0a 29  .  int isRowid.)
b7f0: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
b800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b820: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
b830: 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ress */.  Vdbe *
b840: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b850: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
b860: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b870: 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ...  /* This cod
b880: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
b890: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
b8a0: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
b8b0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
b8c0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
b8d0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
b8e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
b8f0: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
b900: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
b910: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
b920: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
b930: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
b940: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
b950: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
b960: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
b970: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
b980: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
b990: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
b9a0: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
b9b0: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
b9c0: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
b9d0: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
b9e0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
b9f0: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
ba00: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
ba10: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
ba20: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
ba30: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
ba40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
ba50: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
ba60: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
ba70: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b  .    int mem = +
ba80: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ba90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
baa0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d  dOp1(v, OP_If, m
bab0: 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64  em);.    testAdd
bac0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
bad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bae0: 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20  ger, 1, mem);.  
baf0: 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64    assert( testAd
bb00: 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  dr>0 || pParse->
bb10: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bb20: 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63   );.  }..  switc
bb30: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
bb40: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
bb50: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
bb60: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
bb70: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
bb80: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
bb90: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
bba0: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
bbb0: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
bbc0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
bbd0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
bbe0: 65 66 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eft;..      if( 
bbf0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a  rMayHaveNull ){.
bc00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bc10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bc20: 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76  Null, 0, rMayHav
bc30: 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  eNull);.      }.
bc40: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
bc50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
bc60: 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20  inity(pLeft);.. 
bc70: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
bc80: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
bc90: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
bca0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
bcb0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
bcc0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
bcd0: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
bce0: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
bcf0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
bd00: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
bd10: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
bd20: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
bd30: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
bd40: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
bd50: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
bd60: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
bd70: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
bd80: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
bd90: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
bda0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
bdb0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
bdc0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
bdd0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
bde0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
bdf0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
be00: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
be10: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
be20: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
be30: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
be40: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
be50: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
be60: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
be70: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
be80: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
be90: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
bea0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
beb0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
bec0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
bed0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
bee0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
bef0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
bf00: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
bf10: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
bf20: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
bf30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
bf40: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
bf50: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
bf60: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
bf70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bf80: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
bf90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
bfa0: 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  !isRowid);.     
bfb0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
bfc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
bfd0: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
bfe0: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
bff0: 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ..      if( Expr
c000: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c010: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
c020: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
c030: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
c040: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
c050: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c060: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
c070: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
c080: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
c090: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
c0a0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
c0b0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
c0c0: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
c0d0: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
c0e0: 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
c0f0: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
c100: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
c110: 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ist;..        as
c120: 73 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29  sert( !isRowid )
c130: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c140: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
c150: 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20  &dest, SRT_Set, 
c160: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
c170: 20 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66          dest.aff
c180: 69 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69  inity = (u8)affi
c190: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73  nity;.        as
c1a0: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
c1b0: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
c1c0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
c1d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
c1e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c1f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  rse, pExpr->x.pS
c200: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
c210: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
c220: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
c230: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
c240: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  xpr->x.pSelect->
c250: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
c260: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
c270: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
c280: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
c290: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
c2a0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
c2b0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
c2c0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
c2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
c2e0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c2f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
c300: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
c310: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  xpr->x.pList ){.
c320: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
c330: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
c340: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
c350: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c360: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
c370: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
c380: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
c390: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
c3a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
c3b0: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
c3c0: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
c3d0: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
c3e0: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
c3f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
c400: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
c410: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
c420: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
c430: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
c440: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
c450: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
c460: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
c470: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c480: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
c490: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
c4a0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
c4b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c4c0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
c4d0: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
c4e0: 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r3;..        if(
c4f0: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
c500: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
c510: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
c520: 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
c530: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43        keyInfo.aC
c540: 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
c550: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c560: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c570: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  );..        /* L
c580: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
c590: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
c5a0: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
c5b0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
c5c0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
c5d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
c5e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
c5f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
c600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c610: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c620: 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
c630: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
c640: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
c650: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
c660: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
c670: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
c680: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
c690: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
c6a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
c6b0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
c6c0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
c6d0: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
c6e0: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
c6f0: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
c700: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
c710: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
c720: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
c730: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
c740: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
c750: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
c760: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
c770: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
c780: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
c790: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
c7b0: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
c7c0: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
c7d0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
c7e0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
c7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
c800: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
c810: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
c820: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
c830: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
c840: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
c850: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
c860: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
c870: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
c880: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
c890: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
c8a0: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
c8b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33  ++;.          r3
c8c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
c8d0: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
c8e0: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
c8f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
c900: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
c910: 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
c920: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
c930: 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a  bleColCache--;..
c940: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
c950: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
c960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c970: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
c980: 74 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69  tBeInt, r3, sqli
c990: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
c9a0: 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
c9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
c9d0: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
c9e0: 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
c9f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ca00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ca10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ca20: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
ca30: 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
ca40: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
ca50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ca60: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
ca70: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
ca80: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
ca90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caa0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
cab0: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
cac0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
cad0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
cae0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
caf0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
cb00: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
cb10: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
cb20: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
cb30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cb40: 20 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b   if( !isRowid ){
cb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb60: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
cb70: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
cb80: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
cb90: 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
cba0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cbb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
cbc0: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
cbd0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
cbe0: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
cbf0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
cc00: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
cc10: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
cc20: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
cc30: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
cc40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
cc50: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
cc60: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
cc70: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
cc80: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
cc90: 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
cca0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
ccb0: 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30   = { (u8*)"1", 0
ccc0: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c  , 1 };.      Sel
ccd0: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20  ect *pSel;.     
cce0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
ccf0: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
cd00: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
cd10: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
cd20: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70  lect) );.      p
cd30: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
cd40: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
cd50: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
cd60: 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
cd70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
cd80: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
cd90: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
cda0: 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
cdb0: 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
cdc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cdd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
cde0: 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61  ull, 0, dest.iPa
cdf0: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
ce00: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
ce10: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
ce20: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
ce30: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74  se{.        dest
ce40: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69  .eDest = SRT_Exi
ce50: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
ce60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ce70: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ce80: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
ce90: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
cea0: 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
ceb0: 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
cec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ced0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
cee0: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
cef0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
cf00: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
cf10: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
cf20: 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
cf30: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
cf40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
cf50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
cf60: 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
cf70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cf80: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
cf90: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e  >iColumn = dest.
cfa0: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65  iParm;.      bre
cfb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
cfc0: 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b   if( testAddr ){
cfd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cfe0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74  JumpHere(v, test
cff0: 41 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Addr-1);.  }..  
d000: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
d010: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d020: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
d030: 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20  ** Duplicate an 
d040: 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a  8-byte value.*/.
d050: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70  static char *dup
d060: 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20  8bytes(Vdbe *v, 
d070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b  const char *in){
d080: 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73  .  char *out = s
d090: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
d0a0: 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  w(sqlite3VdbeDb(
d0b0: 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75  v), 8);.  if( ou
d0c0: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t ){.    memcpy(
d0d0: 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d  out, in, 8);.  }
d0e0: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
d0f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d100: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
d110: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
d120: 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  e floating point
d130: 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69  .** value descri
d140: 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d  bed by z[0..n-1]
d150: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
d160: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
d170: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
d180: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
d190: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
d1a0: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
d1b0: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
d1c0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
d1d0: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
d1e0: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
d1f0: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
d200: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
d210: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
d220: 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62  oid codeReal(Vdb
d230: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
d240: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
d250: 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20  negateFlag, int 
d260: 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  iMem){.  assert(
d270: 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71   z || v==0 || sq
d280: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e  lite3VdbeDb(v)->
d290: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d2a0: 20 20 61 73 73 65 72 74 28 20 21 7a 20 7c 7c 20    assert( !z || 
d2b0: 21 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28  !sqlite3Isdigit(
d2c0: 7a 5b 6e 5d 29 20 29 3b 0a 20 20 55 4e 55 53 45  z[n]) );.  UNUSE
d2d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0a  D_PARAMETER(n);.
d2e0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 64    if( z ){.    d
d2f0: 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20  ouble value;.   
d300: 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73   char *zV;.    s
d310: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76  qlite3AtoF(z, &v
d320: 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 73  alue);.    if( s
d330: 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75  qlite3IsNaN(valu
d340: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
d350: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d360: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65   OP_Null, 0, iMe
d370: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
d380: 20 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46       if( negateF
d390: 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
d3a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d  alue;.      zV =
d3b0: 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
d3c0: 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
d3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
d3f0: 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
d400: 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20 20  , P4_REAL);.    
d410: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
d420: 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
d430: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
d440: 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
d450: 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
d460: 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
d470: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
d480: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
d490: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
d4a0: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
d4b0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
d4c0: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
d4d0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
d4e0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
d4f0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
d500: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
d510: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
d520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
d530: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
d540: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
d550: 64 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45  dbe *v, Expr *pE
d560: 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
d570: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 63  , int iMem){.  c
d580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d590: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
d5a0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
d5b0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45  {.    int i = pE
d5c0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
d5d0: 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
d5e0: 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
d5f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d600: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
d610: 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Mem);.  }else if
d620: 28 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 45  ( (z = (char*)pE
d630: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30  xpr->token.z)!=0
d640: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
d650: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
d660: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61  ->token.n;.    a
d670: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
d680: 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a  sdigit(z[n]) );.
d690: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
d6a0: 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29  etInt32(z, &i) )
d6b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  {.      if( negF
d6c0: 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
d6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d6f0: 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20  ger, i, iMem);. 
d700: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
d710: 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73  ite3FitsIn64Bits
d720: 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a  (z, negFlag) ){.
d730: 20 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b        i64 value;
d740: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b  .      char *zV;
d750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74  .      sqlite3At
d760: 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b  oi64(z, &value);
d770: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
d780: 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
d790: 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20  lue;.      zV = 
d7a0: 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
d7b0: 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
d7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34  dOp4(v, OP_Int64
d7e0: 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
d7f0: 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
d800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d810: 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20  deReal(v, z, n, 
d820: 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a  negFlag, iMem);.
d830: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
d840: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d850: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
d860: 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
d870: 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
d880: 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
d890: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
d8a0: 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
d8b0: 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72  ister.  An effor
d8c0: 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
d8d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
d8e0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
d8f0: 65 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69  er iReg, but thi
d900: 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72  s is.** not guar
d910: 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63  anteed.  The loc
d920: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  ation of the col
d930: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74  umn value is ret
d940: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
d950: 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  re must be an op
d960: 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
d970: 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e  b in iTable when
d980: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
d990: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20   is called.  If 
d9a0: 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63  iColumn<0 then c
d9b0: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
d9c0: 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
d9d0: 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  he rowid..**.** 
d9e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d9f0: 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ht attempt to re
da00: 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  use the value of
da10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74   the column that
da20: 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
da30: 62 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  been loaded into
da40: 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 54 68   a register.  Th
da50: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77  e value will alw
da60: 61 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69  ays.** be used i
da70: 66 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64  f it has not und
da80: 65 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e  ergone any affin
da90: 69 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75  ity changes.  Bu
daa0: 74 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e  t if.** an affin
dab0: 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f  ity change has o
dac0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
dad0: 65 20 63 61 63 68 65 64 20 76 61 6c 75 65 20 77  e cached value w
dae0: 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75  ill only be.** u
daf0: 73 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43  sed if allowAffC
db00: 68 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  hng is true..*/.
db10: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
db20: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
db30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
db40: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
db50: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
db60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
db70: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
db80: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
db90: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
dba0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
dbb0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
dbc0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
dbd0: 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
dbe0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
dbf0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
dc00: 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
dc10: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
dc20: 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
dc30: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
dc40: 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
dc50: 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20  allowAffChng /* 
dc60: 54 72 75 65 20 69 66 20 70 72 69 6f 72 20 61 66  True if prior af
dc70: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61  finity changes a
dc80: 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64  re OK */.){.  Vd
dc90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
dca0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
dcb0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
dcc0: 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
dcd0: 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
dce0: 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65  lCache; i<pParse
dcf0: 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b  ->nColCache; i++
dd00: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
dd10: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
dd20: 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
dd30: 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  =iColumn.       
dd40: 20 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43      && (!p->affC
dd50: 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66  hange || allowAf
dd60: 66 43 68 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a  fChng) ){.#if 0.
dd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd80: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f  eAddOp0(v, OP_No
dd90: 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
dda0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a  omment((v, "OPT:
ddb0: 20 74 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20   tab%d.col%d -> 
ddc0: 72 25 64 22 2c 20 69 54 61 62 6c 65 2c 20 69 43  r%d", iTable, iC
ddd0: 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29  olumn, p->iReg))
dde0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
ddf0: 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
de00: 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
de10: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69  ert( v!=0 );.  i
de20: 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  f( iColumn<0 ){.
de30: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54      int op = (pT
de40: 61 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28  ab && IsVirtual(
de50: 70 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77  pTab)) ? OP_VRow
de60: 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20  id : OP_Rowid;. 
de70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de80: 64 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp2(v, op, iTab
de90: 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c  le, iReg);.  }el
dea0: 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  se if( pTab==0 )
deb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
dec0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
ded0: 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43  lumn, iTable, iC
dee0: 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
def0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
df00: 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
df10: 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
df20: 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
df30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df40: 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  Op3(v, op, iTabl
df50: 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67  e, iColumn, iReg
df60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
df70: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
df80: 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23  Tab, iColumn);.#
df90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dfa0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
dfb0: 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  T.    if( pTab->
dfc0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
dfd0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
dfe0: 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20  FF_REAL ){.     
dff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e000: 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  p1(v, OP_RealAff
e010: 69 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20  inity, iReg);.  
e020: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
e030: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73   if( pParse->dis
e040: 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
e050: 29 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73  ){.    i = pPars
e060: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20 20  e->iColCache;.  
e070: 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
e080: 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20  ColCache[i];.   
e090: 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
e0a0: 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c  ble;.    p->iCol
e0b0: 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20  umn = iColumn;. 
e0c0: 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
e0d0: 67 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61  g;.    p->affCha
e0e0: 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  nge = 0;.    i++
e0f0: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72  ;.    if( i>=Arr
e100: 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
e110: 43 6f 6c 43 61 63 68 65 29 20 29 20 69 20 3d 20  ColCache) ) i = 
e120: 30 3b 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61  0;.    if( i>pPa
e130: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29  rse->nColCache )
e140: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
e150: 68 65 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 72  he = i;.    pPar
e160: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
e170: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
e180: 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  iReg;.}../*.** C
e190: 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  lear all column 
e1a0: 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 61 73  cache entries as
e1b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e1c0: 65 20 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f 72  e vdbe.** cursor
e1d0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75 6d   with cursor num
e1e0: 62 65 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76  ber iTable..*/.v
e1f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
e200: 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
e210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e220: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66  nt iTable){.  if
e230: 28 20 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ( iTable<0 ){.  
e240: 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
e250: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
e260: 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
e270: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
e280: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
e290: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
e2a0: 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
e2b0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
e2c0: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
e2d0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
e2e0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
e2f0: 65 28 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e 43  e( i==pParse->nC
e300: 6f 6c 43 61 63 68 65 2d 31 20 29 3b 0a 20 20 20  olCache-1 );.   
e310: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f       pParse->aCo
e320: 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72  lCache[i] = pPar
e330: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d  se->aColCache[--
e340: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
e350: 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  e];.        pPar
e360: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
e370: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
e380: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
e390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
e3a0: 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
e3b0: 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
e3c0: 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
e3d0: 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
e3e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
e3f0: 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
e400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e410: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
e420: 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
e430: 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
e440: 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
e450: 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61   int iEnd = iSta
e460: 72 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b  rt + iCount - 1;
e470: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
e480: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
e490: 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
e4a0: 20 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72      int r = pPar
e4b0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
e4c0: 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  .iReg;.    if( r
e4d0: 3e 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69  >=iStart && r<=i
e4e0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61  End ){.      pPa
e4f0: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
e500: 5d 2e 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b  ].affChange = 1;
e510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e520: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
e530: 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
e540: 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
e550: 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
e560: 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
e570: 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
e580: 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
e590: 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
e5a0: 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
e5b0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
e5c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e5d0: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
e5e0: 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
e5f0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72  int i;.  if( iFr
e600: 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e  om==iTo ) return
e610: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e620: 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  ddOp3(pParse->pV
e630: 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46  dbe, OP_Move, iF
e640: 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b  rom, iTo, nReg);
e650: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
e660: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
e670: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78   i++){.    int x
e680: 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
e690: 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20  ache[i].iReg;.  
e6a0: 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26    if( x>=iFrom &
e6b0: 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29  & x<iFrom+nReg )
e6c0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
e6d0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
e6e0: 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a  g += iTo-iFrom;.
e6f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e700: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e710: 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74   to copy content
e720: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
e730: 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
e740: 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
e750: 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
e760: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e770: 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72  ExprCodeCopy(Par
e780: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
e790: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
e7a0: 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
e7b0: 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d   i;.  if( iFrom=
e7c0: 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  =iTo ) return;. 
e7d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67   for(i=0; i<nReg
e7e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
e7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
e800: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
e810: 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69  Copy, iFrom+i, i
e820: 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  To+i);.  }.}../*
e830: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
e840: 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20  if any register 
e850: 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72  in the range iFr
e860: 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69  om..iTo (inclusi
e870: 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61  ve).** is used a
e880: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  s part of the co
e890: 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73  lumn cache..*/.s
e8a0: 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73  tatic int usedAs
e8b0: 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
e8c0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e8d0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
e8e0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
e8f0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
e900: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
e910: 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73     int r = pPars
e920: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
e930: 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
e940: 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
e950: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
e960: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e970: 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  /*.** There is a
e980: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
e990: 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 57  er iReg..**.** W
e9a0: 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d  e are going to m
e9b0: 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 2c  odify the value,
e9c0: 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d   so we need to m
e9d0: 61 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20 69  ake sure it.** i
e9e0: 73 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20 72  s not a cached r
e9f0: 65 67 69 73 74 65 72 2e 20 20 49 66 20 69 52 65  egister.  If iRe
ea00: 67 20 69 73 20 61 20 63 61 63 68 65 64 20 72 65  g is a cached re
ea10: 67 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20  gister,.** then 
ea20: 63 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65 73  clear the corres
ea30: 70 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69  ponding cache li
ea40: 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ne..*/.void sqli
ea50: 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52  te3ExprWritableR
ea60: 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70  egister(Parse *p
ea70: 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29  Parse, int iReg)
ea80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
ea90: 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
eaa0: 68 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  he(pParse, iReg,
eab0: 20 69 52 65 67 29 20 29 7b 0a 20 20 20 20 66 6f   iReg) ){.    fo
eac0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
ead0: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29  >nColCache; i++)
eae0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  {.      if( pPar
eaf0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
eb00: 2e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  .iReg==iReg ){. 
eb10: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
eb20: 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50  ColCache[i] = pP
eb30: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
eb40: 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  --pParse->nColCa
eb50: 63 68 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50  che];.        pP
eb60: 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20  arse->iColCache 
eb70: 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  = pParse->nColCa
eb80: 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  che;.      }.   
eb90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
eba0: 49 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  If the last inst
ebb0: 72 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73  ruction coded is
ebc0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f   an ephemeral co
ebd0: 70 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20  py of any of.** 
ebe0: 74 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e  the registers in
ebf0: 20 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74   the nReg regist
ec00: 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ers beginning wi
ec10: 74 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a  th iReg, then.**
ec20: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73   convert the las
ec30: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72  t instruction fr
ec40: 6f 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f  om OP_SCopy to O
ec50: 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20  P_Copy..*/.void 
ec60: 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
ec70: 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  opy(Parse *pPars
ec80: 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
ec90: 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 61 64   nReg){.  int ad
eca0: 64 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  dr;.  VdbeOp *pO
ecb0: 70 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  p;.  Vdbe *v;.. 
ecc0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
ecd0: 62 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  be;.  addr = sql
ece0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ecf0: 64 64 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20  ddr(v);.  pOp = 
ed00: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
ed10: 28 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20 61  (v, addr-1);.  a
ed20: 73 73 65 72 74 28 20 70 4f 70 20 7c 7c 20 70 50  ssert( pOp || pP
ed30: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
ed40: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
ed50: 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  pOp && pOp->opco
ed60: 64 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20  de==OP_SCopy && 
ed70: 70 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26  pOp->p1>=iReg &&
ed80: 20 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52   pOp->p1<iReg+nR
ed90: 65 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f  eg ){.    pOp->o
eda0: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b  pcode = OP_Copy;
edb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
edc0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
edd0: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
ede0: 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20  f the iAlias-th 
edf0: 61 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74 65  alias in registe
ee00: 72 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68  r.** target.  Th
ee10: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
ee20: 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78  s is called, pEx
ee30: 70 72 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  pr is evaluated 
ee40: 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  to compute.** th
ee50: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
ee60: 6c 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65  lias.  The value
ee70: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e   is stored in an
ee80: 20 61 75 78 69 6c 69 61 72 79 20 72 65 67 69 73   auxiliary regis
ee90: 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ter.** and the n
eea0: 75 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72 65  umber of that re
eeb0: 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e  gister is return
eec0: 65 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65  ed.  On subseque
eed0: 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65  nt calls,.** the
eee0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
eef0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 77 69 74   is returned wit
ef00: 68 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  hout generating 
ef10: 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  any code..**.** 
ef20: 4e 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64  Note that in ord
ef30: 65 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77  er for this to w
ef40: 6f 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62  ork, code must b
ef50: 65 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74  e generated in t
ef60: 68 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72  he.** same order
ef70: 20 74 68 61 74 20 69 74 20 69 73 20 65 78 65 63   that it is exec
ef80: 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61  uted..**.** Alia
ef90: 73 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64  ses are numbered
efa0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31   starting with 1
efb0: 2e 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20  .  So iAlias is 
efc0: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
efd0: 6f 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e  of 1 to pParse->
efe0: 6e 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65  nAlias inclusive
eff0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65  .  .**.** pParse
f000: 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
f010: 31 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20 72  1] records the r
f020: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
f030: 68 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a  here the value.*
f040: 2a 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d  * of the iAlias-
f050: 74 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72  th alias is stor
f060: 65 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68  ed.  If zero, th
f070: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
f080: 65 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e  e.** alias has n
f090: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70  ot yet been comp
f0a0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
f0b0: 69 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61  int codeAlias(Pa
f0c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
f0d0: 20 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70   iAlias, Expr *p
f0e0: 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
f0f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f100: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f110: 20 69 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28   int iReg;.  if(
f120: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41   pParse->nAliasA
f130: 6c 6c 6f 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c  lloc<pParse->nAl
f140: 69 61 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ias ){.    pPars
f150: 65 2d 3e 61 41 6c 69 61 73 20 3d 20 73 71 6c 69  e->aAlias = sqli
f160: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
f170: 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  ee(db, pParse->a
f180: 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20  Alias,.         
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
f1b0: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d  Parse->aAlias[0]
f1c0: 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  )*pParse->nAlias
f1d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f1e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f1f0: 65 64 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 41  ed && pParse->nA
f200: 6c 69 61 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20  liasAlloc>0 );. 
f210: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
f220: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
f230: 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
f240: 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70  pParse->aAlias[p
f250: 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c  Parse->nAliasAll
f260: 6f 63 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  oc], 0,.        
f270: 20 20 20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69     (pParse->nAli
f280: 61 73 2d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as-pParse->nAlia
f290: 73 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70  sAlloc)*sizeof(p
f2a0: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d  Parse->aAlias[0]
f2b0: 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ));.    pParse->
f2c0: 6e 41 6c 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50  nAliasAlloc = pP
f2d0: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20  arse->nAlias;.  
f2e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 41 6c 69  }.  assert( iAli
f2f0: 61 73 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d  as>0 && iAlias<=
f300: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
f310: 3b 0a 20 20 69 52 65 67 20 3d 20 70 50 61 72 73  ;.  iReg = pPars
f320: 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73  e->aAlias[iAlias
f330: 2d 31 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d  -1];.  if( iReg=
f340: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
f350: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
f360: 43 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 69  Cache ){.      i
f370: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
f380: 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
f390: 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
f3a0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
f3b0: 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50       iReg = ++pP
f3c0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f3d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f3e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
f3f0: 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50   iReg);.      pP
f400: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c  arse->aAlias[iAl
f410: 69 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20  ias-1] = iReg;. 
f420: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f430: 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
f440: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
f450: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
f460: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
f470: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
f480: 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d  pression.  Attem
f490: 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  pt to store the 
f4a0: 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
f4b0: 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a  ter "target"..**
f4c0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
f4d0: 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c  ster where resul
f4e0: 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ts are stored..*
f4f0: 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72  *.** With this r
f500: 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73  outine, there is
f510: 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68   no guarantee th
f520: 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a  at results will.
f530: 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ** be stored in 
f540: 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
f550: 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f  ult might be sto
f560: 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  red in some othe
f570: 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66  r.** register if
f580: 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e   it is convenien
f590: 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65  t to do so.  The
f5a0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
f5b0: 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20  n.** must check 
f5c0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
f5d0: 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73  and move the res
f5e0: 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69  ults to the desi
f5f0: 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e  red.** register.
f600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f610: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
f620: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
f630: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
f640: 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
f650: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f660: 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
f670: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
f680: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6a0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
f6b0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
f6c0: 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
f6d0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
f6e0: 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
f6f0: 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
f700: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
f710: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
f720: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
f730: 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
f740: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
f750: 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
f760: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
f770: 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
f780: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
f790: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
f7a0: 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20  2, r3, r4;      
f7b0: 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
f7c0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
f7d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
f7e0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
f7f0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  b;.  assert( v!=
f800: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
f810: 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
f820: 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
f830: 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
f840: 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d  Mem );.  if( v==
f850: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
f860: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
f870: 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c  .    op = TK_NUL
f880: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
f890: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
f8a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70    }.  switch( op
f8b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f8c0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20  AGG_COLUMN: {.  
f8d0: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67      AggInfo *pAg
f8e0: 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  gInfo = pExpr->p
f8f0: 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  AggInfo;.      s
f900: 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
f910: 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49  l *pCol = &pAggI
f920: 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  nfo->aCol[pExpr-
f930: 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66  >iAgg];.      if
f940: 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  ( !pAggInfo->dir
f950: 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  ectMode ){.     
f960: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
f970: 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20  >iMem>0 );.     
f980: 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d     inReg = pCol-
f990: 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62  >iMem;.        b
f9a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
f9b0: 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
f9c0: 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
f9d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f9e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f9f0: 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66  _Column, pAggInf
fa00: 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  o->sortingIdx,. 
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
fa30: 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
fa40: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
fa50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fa60: 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
fa70: 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
fa80: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
fa90: 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
faa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
fab0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
fac0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
fad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
fae0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
faf0: 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
fb00: 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
fb10: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
fb20: 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
fb30: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
fb40: 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
fb50: 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
fb60: 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c  kBase;.      }el
fb70: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
fb80: 63 61 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c  case( (pExpr->fl
fb90: 61 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29  ags & EP_AnyAff)
fba0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
fbb0: 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
fbc0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
fbd0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
fbe0: 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
fc10: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
fc20: 62 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ble, target,.   
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
fc50: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
fc60: 41 6e 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d  AnyAff);.      }
fc70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fc80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fc90: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
fca0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
fcb0: 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74  pExpr, 0, target
fcc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
fcd0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fce0: 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  K_FLOAT: {.     
fcf0: 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68   codeReal(v, (ch
fd00: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fd10: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
fd20: 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  .n, 0, target);.
fd30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fd40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
fd50: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73  TRING: {.      s
fd60: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
fd70: 72 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  r(db, pExpr);.  
fd80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd90: 64 64 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e  ddOp4(v,OP_Strin
fda0: 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30  g8, 0, target, 0
fdb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fdc0: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
fdd0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
fde0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
fdf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fe00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fe10: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
fe20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
fe40: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
fe50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
fe60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe70: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
fe80: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
fe90: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
fea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
feb0: 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
fec0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
fed0: 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
fee0: 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61  .n>=3 );.      a
fef0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
ff00: 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c  ken.z[0]=='x' ||
ff10: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
ff20: 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
ff30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ff40: 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27  token.z[1]=='\''
ff50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ff60: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
ff70: 5b 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d  [pExpr->token.n-
ff80: 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
ff90: 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b    n = pExpr->tok
ffa0: 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20  en.n - 3;.      
ffb0: 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  z = (char*)pExpr
ffc0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20  ->token.z + 2;. 
ffd0: 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
ffe0: 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
fff0: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
10000 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
10010 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10020 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
10030 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
10040 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
10050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10060 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
10070 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
10080 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 69 6f  .      int iPrio
10090 72 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  r;.      VdbeOp 
100a0 2a 70 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20  *pOp;.      if( 
100b0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3c 3d  pExpr->token.n<=
100c0 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69  1.         && (i
100d0 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 56  Prior = sqlite3V
100e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
100f0 29 2d 31 29 3e 3d 30 0a 20 20 20 20 20 20 20 20  )-1)>=0.        
10100 20 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69 74   && (pOp = sqlit
10110 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 69  e3VdbeGetOp(v, i
10120 50 72 69 6f 72 29 29 2d 3e 6f 70 63 6f 64 65 3d  Prior))->opcode=
10130 3d 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20  =OP_Variable.   
10140 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
10150 2b 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d  +pOp->p3==pExpr-
10160 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20  >iTable.        
10170 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
10180 3e 70 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20  >p3==target.    
10190 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e       && pOp->p4.
101a0 7a 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  z==0.      ){.  
101b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
101c0 70 72 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63  previous instruc
101d0 74 69 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20  tion was a copy 
101e0 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
101f0 75 6e 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20  unnamed.        
10200 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74  ** parameter int
10210 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  o the previous r
10220 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69  egister, then si
10230 6d 70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74  mply increment t
10240 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  he.        ** re
10250 70 65 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68  peat count on th
10260 65 20 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74  e prior instruct
10270 69 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20  ion rather than 
10280 6d 61 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20  making a new.   
10290 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
102a0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
102b0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
102c0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
102d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
102e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
102f0 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
10300 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c  >iTable, target,
10310 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
10320 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
10330 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
10340 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10350 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
10360 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
10370 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
10380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10390 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
103a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
103b0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
103c0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
103d0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
103e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
103f0 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
10400 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63  .      inReg = c
10410 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  odeAlias(pParse,
10420 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10430 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
10440 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
10450 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
10460 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
10470 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
10480 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
10490 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
104a0 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
104b0 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
104c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
104d0 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69  , to_op;.      i
104e0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
104f0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
10500 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10510 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
10520 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41    aff = sqlite3A
10530 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78  ffinityType(&pEx
10540 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pr->token);.    
10550 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20    to_op = aff - 
10560 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
10570 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20  + OP_ToText;.   
10580 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
10590 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c  ==OP_ToText    |
105a0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
105b0 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20  F_TEXT    );.   
105c0 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
105d0 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c  ==OP_ToBlob    |
105e0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
105f0 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20  F_NONE    );.   
10600 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
10610 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c  ==OP_ToNumeric |
10620 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
10630 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
10640 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
10650 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c  ==OP_ToInt     |
10660 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
10670 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
10680 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
10690 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c  ==OP_ToReal    |
106a0 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
106b0 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20  F_REAL    );.   
106c0 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f     testcase( to_
106d0 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b  op==OP_ToText );
106e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
106f0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
10700 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  b );.      testc
10710 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
10720 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20  oNumeric );.    
10730 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
10740 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20  p==OP_ToInt );. 
10750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
10760 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
10770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
10780 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
10790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
107a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
107b0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
107c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
107d0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
107e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
107f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10800 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20  to_op, inReg);. 
10810 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
10820 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
10830 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
10840 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
10850 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
10860 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
10870 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
10880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10890 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
108a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
108b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
108c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
108d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
108e0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
108f0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
10900 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
10910 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
10920 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
10930 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10940 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
10950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10960 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
10970 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10980 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
10990 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
109a0 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
109b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
109c0 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
109d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
109e0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
109f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
10a00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10a10 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
10a20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10a30 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
10a40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
10a50 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
10a60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
10a70 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  _NE );.      cod
10a80 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
10a90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10aa0 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
10ab0 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
10ae0 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
10af0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
10b00 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10b10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10b20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
10b30 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
10b40 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
10b50 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
10b60 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EP2);.      test
10b70 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
10b80 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
10b90 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
10ba0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
10bb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10bc0 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
10bd0 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
10be0 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
10bf0 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
10c00 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
10c10 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
10c20 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
10c30 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
10c40 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
10c50 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
10c60 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
10c70 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
10c80 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
10c90 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
10ca0 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
10cb0 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
10cc0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
10cd0 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
10ce0 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
10cf0 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
10d00 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
10d10 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
10d20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10d30 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
10d40 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
10d50 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
10d60 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
10d70 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
10d80 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
10d90 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10da0 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
10db0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10dc0 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
10dd0 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
10de0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
10df0 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
10e00 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
10e10 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
10e20 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
10e30 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
10e40 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20  =TK_AND );.     
10e50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
10e60 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  K_OR );.      te
10e70 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50  stcase( op==TK_P
10e80 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LUS );.      tes
10e90 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
10ea0 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NUS );.      tes
10eb0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
10ec0 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  M );.      testc
10ed0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
10ee0 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ND );.      test
10ef0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
10f00 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OR );.      test
10f10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
10f20 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  SH );.      test
10f30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
10f40 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
10f50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53  tcase( op==TK_RS
10f60 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
10f70 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
10f80 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
10f90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
10fa0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
10fb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
10fc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
10fd0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
10fe0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
10ff0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
11000 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
11010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11020 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
11030 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
11040 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
11050 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
11060 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
11070 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
11080 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11090 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
110a0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
110b0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
110c0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
110d0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
110e0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
110f0 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
11100 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
11110 20 28 63 68 61 72 2a 29 70 4c 65 66 74 2d 3e 74   (char*)pLeft->t
11120 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
11130 6f 6b 65 6e 2e 6e 2c 20 31 2c 20 74 61 72 67 65  oken.n, 1, targe
11140 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
11150 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
11160 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
11170 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
11180 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  (v, pLeft, 1, ta
11190 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
111a0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
111b0 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
111c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
111d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
111e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
111f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11200 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
11210 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
11220 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
11230 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
11240 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
11250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11260 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
11270 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72  act, r2, r1, tar
11280 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  get);.        te
11290 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
112a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
112b0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72       inReg = tar
112c0 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  get;.      break
112d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
112e0 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
112f0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
11300 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
11310 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
11320 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
11330 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
11340 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
11350 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
11360 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
11370 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
11380 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
11390 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
113a0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
113b0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
113c0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
113d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
113e0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
113f0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
11400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11410 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
11420 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
11430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11440 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
11450 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
11460 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
11470 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
11480 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
11490 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
114a0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
114b0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
114c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
114d0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
114e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
114f0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
11500 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11510 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11520 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
11530 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
11540 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
11550 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
11560 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
11570 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
11580 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
11590 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
115a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
115b0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
115c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
115d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
115e0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
115f0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
11600 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11610 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62  , addr);.      b
11620 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11630 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
11640 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
11650 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
11660 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
11670 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
11680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
11690 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
116a0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
116b0 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c   aggregate: %T",
116c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45  .            &pE
116d0 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
116e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
116f0 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e   inReg = pInfo->
11700 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
11710 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  g].iMem;.      }
11720 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11730 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11740 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
11750 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
11760 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
11770 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 0a 20 20  st *pList = (.  
11780 20 20 20 20 20 20 45 78 70 72 48 61 73 41 6e 79        ExprHasAny
11790 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
117a0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
117b0 53 70 61 6e 4f 6e 6c 79 29 20 3f 20 30 20 3a 20  SpanOnly) ? 0 : 
117c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 0a 20  pExpr->x.pList. 
117d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 6e       );.      in
117e0 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
117f0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
11800 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
11810 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
11820 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
11830 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
11840 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
11850 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
11860 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
11870 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
11880 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
11890 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73  l = 0;..      as
118a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
118b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
118c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
118d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
118e0 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  p==TK_CONST_FUNC
118f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11900 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  se( op==TK_FUNCT
11910 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ION );.      zId
11920 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
11930 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
11940 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
11950 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
11960 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
11970 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
11980 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
11990 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
119a0 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
119b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
119c0 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d  .        nExpr =
119d0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
119e0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
119f0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
11a00 70 50 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a  pParse, nExpr);.
11a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11a20 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
11a30 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
11a40 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 1);.      }el
11a50 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70  se{.        nExp
11a60 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20  r = r1 = 0;.    
11a70 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
11a80 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11a90 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ABLE.      /* Po
11aa0 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20  ssibly overload 
11ab0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  the function if 
11ac0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
11ad0 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  nt is.      ** a
11ae0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
11af0 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a  olumn..      **.
11b00 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66        ** For inf
11b10 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49  ix functions (LI
11b20 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50  KE, GLOB, REGEXP
11b30 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65  , and MATCH) use
11b40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65   the.      ** se
11b50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e  cond argument, n
11b60 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73  ot the first, as
11b70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
11b80 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a   test to.      *
11b90 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61  * see if it is a
11ba0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72   column in a vir
11bb0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69  tual table.  Thi
11bc0 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73  s is done becaus
11bd0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  e.      ** the l
11be0 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69  eft operand of i
11bf0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
11c00 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77  the operand we w
11c10 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ant to.      ** 
11c20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64  control overload
11c30 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20  ing) ends up as 
11c40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
11c50 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  ent to the.     
11c60 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54   ** function.  T
11c70 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41  he expression "A
11c80 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69   glob B" is equi
11c90 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20  valent to .     
11ca0 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20   ** "glob(B,A). 
11cb0 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20   We want to use 
11cc0 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62  the A in "A glob
11cd0 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20   B" to test.    
11ce0 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f    ** for functio
11cf0 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20  n overloading.  
11d00 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42  But we use the B
11d10 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42   term in "glob(B
11d20 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ,A)"..      */. 
11d30 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d       if( nExpr>=
11d40 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61  2 && (pExpr->fla
11d50 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e  gs & EP_InfixFun
11d60 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  c) ){.        pD
11d70 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
11d80 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
11d90 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72  (db, pDef, nExpr
11da0 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  , pList->a[1].pE
11db0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
11dc0 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b  e if( nExpr>0 ){
11dd0 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
11de0 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
11df0 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
11e00 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
11e10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
11e20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11e30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11e40 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
11e50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
11e60 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
11e70 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
11e80 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
11e90 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
11ea0 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
11eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
11ec0 66 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  f( (pDef->flags 
11ed0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
11ee0 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
11ef0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
11f00 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
11f10 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
11f20 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
11f30 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
11f40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11f50 20 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73   if( pDef->flags
11f60 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
11f70 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
11f80 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
11f90 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
11fa0 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
11fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11fc0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
11fd0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
11fe0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
11ff0 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
12000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12010 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
12020 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
12030 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
12060 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
12070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12080 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
12090 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  nExpr);.      if
120a0 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( nExpr ){.     
120b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
120c0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
120d0 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
120e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
120f0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
12100 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
12110 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a  se, r1, nExpr);.
12120 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12130 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12140 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
12150 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
12160 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
12170 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
12180 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12190 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
121a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
121b0 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
121c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
121d0 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
121e0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
121f0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
12200 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
12210 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
12220 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
12230 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mn;.      break;
12240 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
12250 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
12260 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30  nt rNotFound = 0
12270 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79  ;.      int rMay
12280 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
12290 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20      int j2, j3, 
122a0 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68  j4, j5;.      ch
122b0 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
122c0 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20     int eType;.. 
122d0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
122e0 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
122f0 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
12300 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54  rget));.      eT
12310 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
12320 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
12330 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76   pExpr, &rMayHav
12340 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66  eNull);.      if
12350 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29  ( rMayHaveNull )
12360 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f  {.        rNotFo
12370 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
12380 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nMem;.      }.. 
12390 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
123a0 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
123b0 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
123c0 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
123d0 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
123e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
123f0 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
12400 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
12410 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
12420 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20  for.      ** P4 
12430 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
12440 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12450 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
12460 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
12470 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f  Expr);...      /
12480 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
12490 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
124a0 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
124b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
124c0 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
124d0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
124e0 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
124f0 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
12500 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
12510 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
12520 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
12530 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12540 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12550 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
12560 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  t);.      pParse
12570 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
12580 65 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20  e--;.      j2 = 
12590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125a0 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
125b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
125c0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
125d0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
125e0 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
125f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12600 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67  _MustBeInt, targ
12610 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20  et);.        j4 
12620 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12630 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
12640 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
12650 6c 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  le, 0, target);.
12660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12670 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12680 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
12690 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20  et);.        j5 
126a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
126b0 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
126c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
126d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
126e0 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j3);.        sql
126f0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12700 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
12710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12720 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12730 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
12740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12750 20 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32     r2 = regFree2
12760 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12770 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
12780 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65         /* Create
12790 20 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65   a record and te
127a0 73 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65  st for set membe
127b0 72 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65  rship. If the se
127c0 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
127d0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c     ** the value,
127e0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
127f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73  e end of the tes
12800 74 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67  t code. The targ
12810 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  et.        ** re
12820 67 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e  gister still con
12830 74 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28  tains the true (
12840 31 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  1) value written
12850 20 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a   to it earlier..
12860 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12880 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
12890 65 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31  ecord, target, 1
128a0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
128b0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
128c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
128d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
128e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
128f0 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
12900 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
12910 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
12920 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20  ble, 0, r2);..  
12930 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
12940 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
12950 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
12960 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12970 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78  e .        ** "x
12980 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
12990 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
129a0 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
129b0 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  If the set.     
129c0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e     ** contains n
129d0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
129e0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
129f0 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20  s 0. If the set 
12a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
12a10 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
12a20 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12a30 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12a40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
12a50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
12a60 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  so NULL..       
12a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12a80 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a  rNotFound==0 ){.
12a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
12aa0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
12ab0 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
12ac0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f  compile time (no
12ad0 77 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  w) that .       
12ae0 20 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f     ** the set co
12af0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
12b00 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
12b10 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
12b20 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  t.          ** o
12b30 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
12b40 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
12b50 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
12b60 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  . No need.      
12b70 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
12b80 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
12b90 65 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20  e at runtime in 
12ba0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
12bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12bd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12be0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
12bf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12c00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
12c10 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20  block populates 
12c20 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65  the rNotFound re
12c30 67 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68  gister with eith
12c40 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  er NULL.        
12c50 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e    ** or 0 (an in
12c60 74 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66  teger value). If
12c70 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
12c80 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ure contains one
12c90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
12ca0 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65   more NULLs, the
12cb0 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20  n set rNotFound 
12cc0 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  to NULL. Otherwi
12cd0 73 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20  se, set it.     
12ce0 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66       ** to 0. If
12cf0 20 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61   register rMayHa
12d00 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64  veNull is alread
12d10 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  y set to some va
12d20 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lue.          **
12d30 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c   other than NULL
12d40 2c 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20  , then the test 
12d50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
12d60 20 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20   run and .      
12d70 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64      ** rNotFound
12d80 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75   is already popu
12d90 6c 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  lated..         
12da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74   */.          st
12db0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
12dc0 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b  nullRecord[] = {
12dd0 20 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20   0x02, 0x00 };. 
12de0 20 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71           j3 = sq
12df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12e00 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
12e10 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
12e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12e40 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75  Null, 0, rNotFou
12e50 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nd);.          s
12e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12e70 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20  (v, OP_Blob, 2, 
12e80 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c  rMayHaveNull, 0,
12e90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
12eb0 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54  ullRecord, P4_ST
12ec0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
12ed0 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j4 = sqlite3Vdb
12ee0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
12ef0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
12f00 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  le, 0, rMayHaveN
12f10 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
12f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12f40 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a   0, rNotFound);.
12f50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12f60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12f70 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   j4);.          
12f80 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
12f90 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20  ere(v, j3);..   
12fa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
12fb0 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69  he value of regi
12fc0 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28  ster rNotFound (
12fd0 77 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20  which is either 
12fe0 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20  NULL or 0).     
12ff0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
13000 20 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72   target register
13010 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
13020 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
13030 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
13040 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20  pression..      
13050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13070 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
13080 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74  NotFound, target
13090 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
130a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
130b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
130c0 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j2);.      sql
130d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
130e0 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 56  (v, j5);.      V
130f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13100 65 6e 64 20 49 4e 20 65 78 70 72 20 72 25 64 22  end IN expr r%d"
13110 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20  , target));.    
13120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
13130 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20  endif.    /*.   
13140 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
13150 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
13160 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
13170 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
13180 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
13190 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
131a0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
131b0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
131c0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
131d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
131e0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
131f0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
13200 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
13210 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
13220 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
13230 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
13240 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
13250 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
13260 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
13270 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13280 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
13290 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20  r->x.pList->a;. 
132a0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
132b0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
132c0 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  r;..      codeCo
132d0 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
132e0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31  arse, pLeft, &r1
132f0 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13320 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
13330 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
13340 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
13350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
13360 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
13370 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  =0 );.      r3 =
13380 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13390 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
133a0 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
133b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
133c0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
133d0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
133e0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
133f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13400 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
13410 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
13420 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
13430 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
13440 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
13450 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
13460 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13470 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
13480 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
13490 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
134a0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
134b0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
134c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
134d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
134e0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
134f0 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
13500 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
13510 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
13520 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  P2);.      sqlit
13530 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13540 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
13550 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
13560 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13570 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
13580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
13590 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
135a0 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
135b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
135c0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
135d0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
135e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
135f0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
13600 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
13610 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
13620 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13630 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
13640 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
13650 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
13660 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
13670 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
13680 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
13690 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
136a0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
136b0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
136c0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
136d0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
136e0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
136f0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
13700 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
13710 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
13720 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
13730 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
13740 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
13750 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
13760 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
13770 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
13780 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
13790 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
137a0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
137b0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
137c0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
137d0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
137e0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
137f0 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
13800 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
13810 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
13820 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
13830 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
13840 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
13850 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
13860 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
13870 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
13880 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
13890 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
138a0 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
138b0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
138c0 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
138d0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
138e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
138f0 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
13900 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
13910 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
13920 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
13930 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
13940 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
13950 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
13960 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
13970 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
13980 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
13990 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
139a0 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
139b0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
139c0 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
139d0 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
139e0 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
139f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
13a00 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
13a10 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
13a20 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
13a30 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
13a60 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
13a70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13aa0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13ab0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
13ac0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
13ad0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
13ae0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
13af0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13b00 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
13b10 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
13b20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
13b30 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
13b40 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
13b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13b60 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
13b70 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63   */.      Expr c
13b80 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20  acheX;          
13b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13ba0 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ached expression
13bb0 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72   X */.      Expr
13bc0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13be0 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
13bf0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
13c00 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pTest = 0;     
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
13c30 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
13c40 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
13c50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
13c60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
13c70 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45  xIsSelect) && pE
13c80 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a  xpr->x.pList );.
13c90 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
13ca0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
13cb0 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
13cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
13cd0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
13ce0 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
13cf0 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
13d00 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  .pList;.      aL
13d10 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
13d20 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
13d30 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
13d40 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c  ;.      endLabel
13d50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13d60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13d70 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70    if( (pX = pExp
13d80 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a  r->pLeft)!=0 ){.
13d90 20 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d          cacheX =
13da0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
13db0 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
13dc0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d  TK_COLUMN || pX-
13dd0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
13de0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
13df0 65 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  eX.iTable = sqli
13e00 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
13e10 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
13e20 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
13e30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
13e40 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e1==0 );.       
13e50 20 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f   cacheX.op = TK_
13e60 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
13e70 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
13e80 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
13e90 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
13ea0 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20  = &cacheX;.     
13eb0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
13ec0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  mpare;.      }. 
13ed0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
13ee0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
13ef0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13f00 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
13f10 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
13f20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
13f30 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
13f40 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
13f50 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
13f60 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
13f70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13f80 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
13f90 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
13fa0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
13fb0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
13fc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13fd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13fe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13ff0 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
14000 4d 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d  MN || pTest->op=
14010 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
14020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14030 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14040 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61  e, pTest, nextCa
14050 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  se, SQLITE_JUMPI
14060 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  FNULL);.        
14070 74 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65  testcase( aListe
14080 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e  lem[i+1].pExpr->
14090 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
140a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
140b0 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
140c0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
140d0 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20  REGISTER );.    
140e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
140f0 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
14100 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
14110 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
14120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14130 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
14140 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20   0, endLabel);. 
14150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14160 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14170 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
14180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
14190 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
141a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
141b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
141c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74  pExpr->pRight, t
141d0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65  arget);.      }e
141e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
141f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14200 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
14210 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rget);.      }. 
14220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14230 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14240 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
14250 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
14260 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
14270 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
14280 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14290 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65  che--;.      bre
142a0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
142b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
142c0 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
142d0 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
142e0 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
142f0 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
14300 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14310 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
14340 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
14350 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
14360 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
14370 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
14380 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
14390 72 2d 3e 61 66 66 69 6e 69 74 79 21 3d 4f 45 5f  r->affinity!=OE_
143a0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
143b0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
143c0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
143d0 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
143e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
143f0 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f  r->affinity == O
14400 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20  E_Abort ||.     
14410 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
14420 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f  r->affinity == O
14430 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
14440 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
14450 65 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 29  eExpr(db, pExpr)
14460 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
14470 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14480 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
14490 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
144a0 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 30 2c 0a  r->affinity, 0,.
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
144d0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
144e0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
144f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
14500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14510 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
14520 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a  == OE_Ignore );.
14530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14550 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20  _ContextPop, 0, 
14560 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0);.         sql
14570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14580 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
14590 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
145a0 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20  >ignoreJump);.  
145b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
145c0 6e 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47  nt((v, "raise(IG
145d0 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20  NORE)"));.      
145e0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
145f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
14600 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14610 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
14620 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
14630 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14640 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
14650 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ee2);.  return i
14660 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nReg;.}../*.** G
14670 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14680 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
14690 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
146a0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
146b0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
146c0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
146d0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
146e0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
146f0 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
14700 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
14710 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
14720 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
14730 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
14740 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
14750 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
14760 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
14770 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
14780 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
14790 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
147a0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
147b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
147c0 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73  xprCodeTemp(Pars
147d0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
147e0 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65  *pExpr, int *pRe
147f0 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  g){.  int r1 = s
14800 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14810 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
14820 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
14830 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
14840 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
14850 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
14860 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
14870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14880 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14890 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
148a0 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20     *pReg = 0;.  
148b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
148c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
148d0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
148e0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
148f0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
14900 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
14910 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
14920 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
14930 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
14940 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
14950 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
14960 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  et..*/.int sqlit
14970 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
14980 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
14990 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
149a0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
149b0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
149c0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
149d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
149e0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
149f0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
14a10 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
14a20 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
14a30 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
14a40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
14a50 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
14a60 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
14a70 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
14a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
14a90 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
14aa0 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
14ab0 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  get);.  }.  retu
14ac0 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  rn target;.}../*
14ad0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14ae0 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
14af0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
14b00 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
14b10 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
14b20 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
14b30 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
14b40 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
14b50 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
14b60 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
14b70 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
14b80 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
14b90 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
14ba0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
14bb0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
14bc0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
14bd0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
14be0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
14bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
14c00 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
14c10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
14c20 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
14c30 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
14c40 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
14c50 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
14c60 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
14c70 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
14c80 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   reused..*/.int 
14c90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
14ca0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
14cb0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
14cc0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
14cd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14ce0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
14cf0 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67  t inReg;.  inReg
14d00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14d10 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14d20 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73  , target);.  ass
14d30 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
14d40 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
14d50 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b  !=TK_REGISTER ){
14d60 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b    .    int iMem;
14d70 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  .    iMem = ++pP
14d80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
14d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14da0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e  2(v, OP_Copy, in
14db0 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  Reg, iMem);.    
14dc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
14dd0 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d  iMem;.    pExpr-
14de0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
14df0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
14e00 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
14e10 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
14e20 45 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74  Expr is an const
14e30 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ant expression t
14e40 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
14e50 74 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72  te.** for factor
14e60 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  ing out of a loo
14e70 70 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  p.  Appropriate 
14e80 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a  expressions are:
14e90 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79  .**.**    *  Any
14ea0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
14eb0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77   evaluates to tw
14ec0 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65  o or more opcode
14ed0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41  s..**.**    *  A
14ee0 6e 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f  ny OP_Integer, O
14ef0 50 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e  P_Real, OP_Strin
14f00 67 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e  g, OP_Blob, OP_N
14f10 75 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f  ull, .**       o
14f20 72 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68  r OP_Variable th
14f30 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
14f40 20 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e   to be placed in
14f50 20 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65   a .**       spe
14f60 63 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a  cific register..
14f70 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e  **.** There is n
14f80 6f 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f  o point in facto
14f90 72 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d  ring out single-
14fa0 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73  instruction cons
14fb0 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
14fc0 6f 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ons that need to
14fd0 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20   be placed in a 
14fe0 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
14ff0 74 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75  ter.  .** We cou
15000 6c 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f  ld factor them o
15010 75 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20  ut, but then we 
15020 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64  would end up add
15030 69 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f  ing an.** OP_SCo
15040 70 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  py instruction t
15050 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65  o move the value
15060 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
15070 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61  t register.** la
15080 74 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61  ter.  We might a
15090 73 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20  s well just use 
150a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73  the original ins
150b0 74 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  truction and.** 
150c0 61 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f  avoid the OP_SCo
150d0 70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  py..*/.static in
150e0 74 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46  t isAppropriateF
150f0 6f 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72  orFactoring(Expr
15100 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c   *p){.  if( !sql
15110 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
15120 6e 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a  ntNotJoin(p) ){.
15130 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
15140 2a 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  * Only constant 
15150 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
15160 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
15170 66 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d  factoring */.  }
15180 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
15190 20 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29   & EP_FixedDest)
151a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
151b0 6e 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e  n 1;  /* Any con
151c0 73 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20  stant without a 
151d0 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
151e0 6e 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  n is appropriate
151f0 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
15200 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
15210 20 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b   ) p = p->pLeft;
15220 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
15230 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
15240 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
15250 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
15260 5f 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20  _BLOB:.#endif.  
15270 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
15280 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
15290 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
152a0 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
152b0 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
152c0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
152d0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
152e0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c  se( p->op==TK_BL
152f0 4f 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OB );.      test
15300 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
15310 56 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20  VARIABLE );.    
15320 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
15330 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b  p==TK_INTEGER );
15340 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15350 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54   p->op==TK_FLOAT
15360 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15370 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55  se( p->op==TK_NU
15380 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
15390 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
153a0 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  STRING );.      
153b0 2f 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75  /* Single-instru
153c0 63 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ction constants 
153d0 77 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73  with a fixed des
153e0 74 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20  tination are.   
153f0 20 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e     ** better don
15400 65 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77  e in-line.  If w
15410 65 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74  e factor them, t
15420 68 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e  hey will just en
15430 64 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65  d.      ** up ge
15440 6e 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53  nerating an OP_S
15450 43 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65  Copy to move the
15460 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65   value to the de
15470 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  stination.      
15480 2a 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a  ** register. */.
15490 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
154a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
154b0 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
154c0 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d     if( p->pLeft-
154d0 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
154e0 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
154f0 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
15500 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15520 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15530 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
15540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15550 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
15560 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ../*.** If pExpr
15570 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
15580 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
15590 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
155a0 72 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f  r.** factoring o
155b0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68  ut of a loop, th
155c0 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  en evaluate the 
155d0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e  expression.** in
155e0 74 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e  to a register an
155f0 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78  d convert the ex
15600 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20  pression into a 
15610 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65  TK_REGISTER.** e
15620 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74  xpression..*/.st
15630 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e  atic int evalCon
15640 73 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70  stExpr(Walker *p
15650 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
15660 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
15670 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
15680 3e 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63  >pParse;.  switc
15690 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
156a0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
156b0 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  STER: {.      re
156c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
156d0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
156e0 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
156f0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
15700 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
15710 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  FUNC: {.      /*
15720 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
15730 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76  o a function hav
15740 65 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e  e a fixed destin
15750 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ation..      ** 
15760 4d 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77  Mark them this w
15770 61 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65  ay to avoid gene
15780 72 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f  rated unneeded O
15790 50 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a  P_SCopy.      **
157a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a   instructions. .
157b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
157c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
157d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
157e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
157f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15800 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
15810 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
15820 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
15830 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
15840 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
15850 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
15860 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
15870 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
15880 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
15890 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
158a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
158b0 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70  pExpr ) pItem->p
158c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
158d0 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
158e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
158f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15900 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
15910 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
15920 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
15930 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
15940 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
15950 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
15960 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15970 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
15980 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
15990 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c  if( r1!=r2 ) sql
159a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
159b0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
159c0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
159d0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
159e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
159f0 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
15a00 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
15a10 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
15a20 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  inue;.}../*.** P
15a30 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
15a40 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
15a50 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
15a60 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
15a70 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
15a80 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
15a90 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
15aa0 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
15ab0 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
15ac0 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
15ad0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
15ae0 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
15af0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
15b00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15b10 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
15b20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15b30 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
15b40 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
15b50 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
15b60 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Expr;.  w.xSelec
15b70 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
15b80 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
15b90 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
15ba0 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
15bb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
15bc0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
15bd0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
15be0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
15bf0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
15c00 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
15c10 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
15c20 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
15c30 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
15c40 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
15c50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
15c60 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
15c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15c80 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
15c90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15ca0 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
15cb0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
15cc0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
15cd0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
15ce0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
15cf0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
15d00 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
15d10 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
15d20 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
15d30 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
15d40 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
15d50 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
15d60 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
15d70 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15d80 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
15d90 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
15da0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
15db0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
15dc0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
15dd0 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
15de0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
15df0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
15e00 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
15e10 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->iAlias ){.   
15e20 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f     int iReg = co
15e30 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
15e40 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70  pItem->iAlias, p
15e50 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72  Item->pExpr, tar
15e60 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  get+i);.      Vd
15e70 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
15e80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15e90 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
15ea0 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
15eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
15ed0 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
15ee0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
15ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
15f00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
15f10 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
15f20 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
15f30 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61    }.    if( doHa
15f40 72 64 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20  rdCopy ){.      
15f50 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
15f60 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67  opy(pParse, targ
15f70 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  et, n);.    }.  
15f80 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
15f90 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15fa0 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
15fb0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
15fc0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
15fd0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
15fe0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
15ff0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
16000 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
16010 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
16020 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
16030 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
16040 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
16050 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
16060 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
16070 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
16080 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
16090 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
160a0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
160b0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
160c0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
160d0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
160e0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
160f0 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
16100 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
16110 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
16120 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
16130 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
16140 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
16150 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
16160 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
16170 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
16180 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
16190 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
161a0 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
161b0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
161c0 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
161d0 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
161e0 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
161f0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
16200 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
16210 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
16220 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
16230 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
16240 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
16250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
16260 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
16270 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
16280 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
16290 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
162a0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
162b0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
162c0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
162d0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
162e0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
162f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
16300 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
16310 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
16320 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
16330 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
16340 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
16350 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
16360 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
16370 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
16380 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
16390 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
163a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
163b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
163c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
163d0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
163e0 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
163f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16400 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16410 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
16420 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
16430 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
16440 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
16450 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
16460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16470 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
16480 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16490 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
164a0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
164b0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
164c0 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
164d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
164e0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
164f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16500 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16510 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
16520 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16530 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
16540 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
16550 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
16560 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72    testcase( pPar
16570 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
16580 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  che==0 );.      
16590 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
165a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
165b0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
165c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
165d0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
165e0 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
165f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
16600 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
16610 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
16620 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
16630 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
16640 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
16650 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  che>0 );.      p
16660 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
16670 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20  lCache--;.      
16680 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16690 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
166a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
166b0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
166c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
166d0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
166e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
166f0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
16700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16710 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16720 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
16730 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
16740 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
16750 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
16760 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
16770 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
16780 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
16790 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
167a0 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
167b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
167c0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
167d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
167e0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
167f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16800 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
16810 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
16820 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
16830 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16840 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
16850 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16860 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
16870 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
16880 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16890 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
168a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
168b0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
168c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
168d0 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
168e0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
168f0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
16900 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
16910 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
16920 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
16930 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16960 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
16970 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16980 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16990 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
169a0 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
169b0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
169c0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
169d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
169e0 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
169f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
16a00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16a10 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
16a20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16a30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16a40 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
16a50 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
16a60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
16a70 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
16a80 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
16a90 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
16aa0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
16ab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16ac0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
16ad0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16ae0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
16af0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16b00 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16b10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16b20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
16b30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16b40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
16b50 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
16b60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16b70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
16b80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16b90 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
16ba0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  EN: {.      /*  
16bb0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
16bc0 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  D z.      **.   
16bd0 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c     ** Is equival
16be0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
16bf0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  .      **    x>=
16c00 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20  y AND x<=z.     
16c10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64   **.      ** Cod
16c20 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
16c30 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
16c40 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
16c50 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
16c60 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
16c70 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  f x..      */.  
16c80 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64      Expr exprAnd
16c90 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
16ca0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
16cb0 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20  r compRight;.   
16cc0 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a     Expr exprX;..
16cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16ce0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16cf0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
16d00 63 74 29 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ct) );.      exp
16d10 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
16d20 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
16d30 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  d.op = TK_AND;. 
16d40 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65       exprAnd.pLe
16d50 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a  ft = &compLeft;.
16d60 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52        exprAnd.pR
16d70 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68  ight = &compRigh
16d80 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  t;.      compLef
16d90 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
16da0 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65      compLeft.pLe
16db0 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
16dc0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67     compLeft.pRig
16dd0 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
16de0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
16df0 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
16e00 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20  .op = TK_LE;.   
16e10 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65     compRight.pLe
16e20 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20  ft = &exprX;.   
16e30 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69     compRight.pRi
16e40 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
16e50 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
16e60 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54  ;.      exprX.iT
16e70 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
16e80 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16e90 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
16ea0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
16eb0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
16ec0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
16ed0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
16ee0 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER;.      testca
16ef0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
16f00 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
16f10 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
16f20 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
16f30 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16f40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16f50 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
16f60 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  : {.      r1 = s
16f70 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16f80 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
16f90 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16fa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16fb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
16fc0 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
16fd0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
16fe0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16ff0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
17000 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
17010 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
17020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
17030 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
17040 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17050 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
17060 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
17070 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
17080 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
17090 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
170a0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
170b0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
170c0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
170d0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
170e0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
170f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
17100 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
17110 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
17120 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
17130 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
17140 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
17150 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17160 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
17170 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
17180 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
17190 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
171a0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
171b0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
171c0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
171d0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
171e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
171f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
17200 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
17210 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
17220 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
17230 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
17240 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17250 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
17260 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
17270 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
17280 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
17290 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
172a0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
172b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
172c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
172d0 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
172e0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
172f0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
17300 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
17310 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
17320 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
17330 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
17340 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
17350 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
17360 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
17370 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
17380 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
17390 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
173a0 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
173b0 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
173c0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
173d0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
173f0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
17400 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
17410 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
17420 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
17430 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
17440 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
17450 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
17460 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
17480 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
17490 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
174a0 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
174b0 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
174c0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
174d0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
174e0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
174f0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
17500 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
17510 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
17520 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
17530 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
17540 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
17550 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
17560 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
17570 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
17580 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
17590 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
175a0 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
175b0 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
175c0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
175d0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
175e0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
175f0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
17600 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
17610 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
17620 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
17630 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
17640 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
17650 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
17660 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
17670 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
17680 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
17690 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
176a0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
176b0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
176c0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
176d0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
176e0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
176f0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
17700 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
17710 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
17720 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
17730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
17740 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
17750 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
17760 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17770 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
17780 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
17790 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
177a0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
177b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
177c0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
177d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
177e0 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
177f0 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
17800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17810 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
17820 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17830 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
17840 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  l);.      pParse
17850 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17860 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
17870 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
17880 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
17890 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
178a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
178b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
178c0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
178d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
178e0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
178f0 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  --;.      break;
17900 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17910 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
17920 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
17930 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17940 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17950 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
17960 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17970 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
17980 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
17990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
179a0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
179b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
179c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
179d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
179e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
179f0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
17a00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17a10 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
17a20 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
17a30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
17a40 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
17a50 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
17a60 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a  leColCache>0 );.
17a70 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
17a80 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b  sableColCache--;
17a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17aa0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17ab0 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
17ac0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17ad0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
17ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17af0 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
17b00 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
17b10 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
17b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17b30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
17b40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
17b50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
17b60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
17b70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
17b80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
17b90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
17ba0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
17bb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17bc0 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
17bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17be0 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
17bf0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17c00 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
17c10 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
17c20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17c30 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
17c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17c50 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
17c60 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
17c70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
17c80 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17c90 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31  , &r1, &regFree1
17ca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
17cd0 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65  t, &r2, &regFree
17ce0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
17cf0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
17d00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
17d10 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
17d40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
17d50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17d60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
17d70 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17d80 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17d90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17da0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
17db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
17dc0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65  NULL: {.      te
17dd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
17de0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74  SNULL );.      t
17df0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17e00 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
17e10 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
17e20 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17e30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17e40 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
17e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17e60 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
17e70 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
17e80 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17e90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
17ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17eb0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
17ec0 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54       /*    x BET
17ed0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
17ee0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
17ef0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
17f00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17f10 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
17f20 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  <=z.      **.   
17f30 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73     ** Code it as
17f40 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61   such, taking ca
17f50 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  re to do the com
17f60 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f  mon subexpressio
17f70 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65  n.      ** eleme
17f80 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20  ntation of x..  
17f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
17fa0 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20  r exprAnd;.     
17fb0 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a   Expr compLeft;.
17fc0 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52        Expr compR
17fd0 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72  ight;.      Expr
17fe0 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61   exprX;..      a
17ff0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18000 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18010 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
18020 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
18030 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
18040 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
18050 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
18060 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
18070 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
18080 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
18090 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
180a0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
180b0 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
180c0 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
180d0 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
180e0 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
180f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
18100 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
18110 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
18120 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
18130 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
18140 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
18150 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
18160 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
18170 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
18180 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
18190 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
181a0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
181b0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
181c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
181d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
181e0 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
181f0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
18200 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
18210 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
18220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
18230 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
18240 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
18250 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
18260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18270 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
18280 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
18290 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
182a0 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
182b0 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
182c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
182d0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
182e0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
182f0 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
18300 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
18310 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
18320 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
18330 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
18340 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
18350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18360 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18370 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
18380 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18390 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
183a0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
183b0 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
183c0 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
183d0 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
183e0 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
183f0 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
18400 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
18410 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
18420 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
18430 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
18440 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
18450 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
18460 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
18470 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
18480 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
18490 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
184a0 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
184b0 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
184c0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
184d0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
184e0 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
184f0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
18500 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
18510 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
18520 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
18530 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
18540 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
18550 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
18560 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
18570 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
18580 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
18590 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
185a0 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
185b0 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
185c0 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
185d0 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
185e0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
185f0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
18600 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
18610 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
18620 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
18630 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
18640 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
18650 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
18660 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
18670 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
18680 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
18690 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
186a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
186b0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
186c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
186d0 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
186e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
186f0 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  =pA;.  }.  if( E
18700 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18710 41 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  A, EP_xIsSelect)
18720 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
18730 72 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65  rty(pB, EP_xIsSe
18740 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74  lect) ){.    ret
18750 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
18760 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
18770 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
18780 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
18790 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  inct) ) return 0
187a0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  ;.  if( pA->op!=
187b0 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
187c0 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
187d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
187e0 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
187f0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
18800 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
18810 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
18820 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
18830 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
18840 69 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20  if( pA->x.pList 
18850 26 26 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29  && pB->x.pList )
18860 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 78 2e  {.    if( pA->x.
18870 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
18880 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
18890 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
188a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
188b0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  x.pList->nExpr; 
188c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
188d0 20 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 78   *pExprA = pA->x
188e0 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
188f0 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  pr;.      Expr *
18900 70 45 78 70 72 42 20 3d 20 70 42 2d 3e 78 2e 70  pExprB = pB->x.p
18910 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
18920 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  ;.      if( !sql
18930 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
18940 70 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20  pExprA, pExprB) 
18950 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
18960 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41  }.  }else if( pA
18970 2d 3e 78 2e 70 4c 69 73 74 20 7c 7c 20 70 42 2d  ->x.pList || pB-
18980 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
18990 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
189a0 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
189b0 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
189c0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
189d0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
189e0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70   0;.  if( pA->op
189f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  !=TK_COLUMN && p
18a00 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20  A->token.z ){.  
18a10 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
18a20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
18a30 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
18a40 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e  en.n!=pA->token.
18a50 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
18a60 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
18a70 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d  NICmp((char*)pA-
18a80 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29  >token.z,(char*)
18a90 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e  pB->token.z,pB->
18aa0 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20  token.n)!=0 ){. 
18ab0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18ac0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18ad0 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 1;.}.../*.** A
18ae0 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
18af0 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
18b00 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
18b10 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
18b20 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
18b30 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
18b40 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
18b50 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
18b60 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
18b70 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
18b80 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
18b90 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
18ba0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
18bb0 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
18bc0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
18bd0 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
18be0 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
18bf0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
18c00 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
18c10 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26       3,.       &
18c20 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a  pInfo->nColumn,.
18c30 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
18c40 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ColumnAlloc,.   
18c50 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65      &i.  );.  re
18c60 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
18c70 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
18c80 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
18c90 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
18ca0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
18cb0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
18cc0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
18cd0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
18ce0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
18cf0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
18d00 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
18d10 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20  nfoFunc(sqlite3 
18d20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
18d30 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
18d40 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20   pInfo->aFunc = 
18d50 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
18d60 63 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c  cate(.       db,
18d70 20 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   .       pInfo->
18d80 61 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69  aFunc,.       si
18d90 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e  zeof(pInfo->aFun
18da0 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  c[0]),.       3,
18db0 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
18dc0 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70  nFunc,.       &p
18dd0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63  Info->nFuncAlloc
18de0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
18df0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
18e00 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
18e10 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
18e20 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
18e30 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
18e40 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
18e50 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
18e60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
18e70 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
18e80 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
18e90 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
18ea0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
18eb0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
18ec0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
18ed0 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
18ee0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
18ef0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
18f00 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
18f10 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
18f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
18f30 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
18f40 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
18f50 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
18f60 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
18f70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
18f80 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
18f90 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
18fa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
18fb0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
18fc0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
18fd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18fe0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
18ff0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
19000 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
19010 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
19020 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
19030 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19040 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
19050 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
19060 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
19070 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
19080 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
19090 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
190a0 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  SrcList ){.     
190b0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
190c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
190d0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
190e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
190f0 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
19100 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19110 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
19120 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
19130 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
19140 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
19150 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
19160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
19170 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
19180 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
19190 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
191a0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
191b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
191c0 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
191d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
191e0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
191f0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
19200 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
19210 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
19220 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
19230 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
19240 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
19250 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
19260 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
19270 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
19280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19290 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
192a0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
192b0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
192c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
192d0 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
192e0 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
192f0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
19300 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
19310 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
19320 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
19330 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
19340 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
19350 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
19360 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19380 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
19390 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
193a0 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
193b0 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
193c0 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
193d0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
193e0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
193f0 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
19400 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
19410 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
19420 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
19440 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
19450 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
19460 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
19470 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
19480 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
19490 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
194a0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
194b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
194c0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
194d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
194e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
194f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
19500 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
19510 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
19520 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
19530 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
19540 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
19560 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
19570 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
19580 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
19590 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
195b0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
195c0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
195d0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
195e0 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
195f0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
19600 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
19610 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
19640 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
19660 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
19670 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
19680 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
19690 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
196a0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
196b0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
196c0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
196d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
196e0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
196f0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
19700 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19750 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
19760 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
19770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19780 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
19790 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
197a0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
197b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
197c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
197d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
197e0 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
197f0 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
19800 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
19810 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
19820 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
19830 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
19840 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
19850 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
19860 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
19870 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
19880 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
19890 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
198a0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
198b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
198c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
198d0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
198e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
198f0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
19900 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
19910 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
19920 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c  >op = TK_AGG_COL
19930 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UMN;.           
19940 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b   pExpr->iAgg = k
19950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
19960 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
19970 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
19980 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
19990 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
199a0 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
199b0 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
199c0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
199d0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
199e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
199f0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
19a00 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
19a10 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
19a20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72  test causes aggr
19a30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
19a40 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  in subqueries.  
19a50 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e      ** to be ign
19a60 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  ored */.      if
19a70 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
19a80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
19a90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
19aa0 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63  Expr is a duplic
19ab0 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61  ate of another a
19ac0 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20  ggregate .      
19ad0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68    ** function th
19ae0 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  at is already in
19af0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74   the pAggInfo st
19b00 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20  ructure.        
19b10 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  */.        struc
19b20 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
19b30 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f  pItem = pAggInfo
19b40 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->aFunc;.       
19b50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
19b60 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
19b70 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19b80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
19b90 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
19ba0 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72  em->pExpr, pExpr
19bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
19bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19be0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
19bf0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
19c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
19c10 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
19c20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
19c30 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
19c40 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
19c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
19c60 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
19c70 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
19c80 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
19c90 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
19ca0 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
19cb0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
19cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
19cd0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
19ce0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
19cf0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
19d00 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
19d10 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
19d20 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
19d30 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
19d40 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
19d50 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
19d60 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
19d70 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
19d80 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
19d90 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
19da0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
19dd0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
19de0 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
19df0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
19e00 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78  r->x.pList ? pEx
19e10 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
19e20 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
19e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
19e40 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
19e50 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
19e70 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
19e80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
19e90 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
19ea0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
19eb0 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
19ec0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
19ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19ee0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19ef0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
19f00 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
19f10 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
19f20 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
19f30 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
19f40 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
19f50 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  g = i;.        p
19f60 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
19f70 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
19f80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
19f90 75 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  une;.      }.   
19fa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19fb0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
19fc0 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
19fd0 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65  zeAggregatesInSe
19fe0 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  lect(Walker *pWa
19ff0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
1a000 65 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f  elect){.  NameCo
1a010 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
1a020 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69  lker->u.pNC;.  i
1a030 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
1a040 30 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  0 ){.    pNC->nD
1a050 65 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  epth++;.    sqli
1a060 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1a070 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b  alker, pSelect);
1a080 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
1a090 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  --;.    return W
1a0a0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73  RC_Prune;.  }els
1a0b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  e{.    return WR
1a0c0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
1a0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
1a0e0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1a0f0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
1a100 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
1a110 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
1a120 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
1a130 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
1a140 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
1a150 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
1a160 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
1a170 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
1a180 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
1a190 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
1a1a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1a1b0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
1a1c0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
1a1d0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
1a1e0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
1a1f0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
1a200 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
1a210 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1a220 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1a230 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
1a240 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
1a250 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
1a260 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  r w;.  w.xExprCa
1a270 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
1a280 41 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78  Aggregate;.  w.x
1a290 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1a2a0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
1a2b0 65 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e  esInSelect;.  w.
1a2c0 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73  u.pNC = pNC;.  s
1a2d0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
1a2e0 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  w, pExpr);.}../*
1a2f0 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
1a300 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1a310 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
1a320 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1a330 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
1a340 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
1a350 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1a360 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
1a370 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
1a380 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
1a390 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76   cut short..*/.v
1a3a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
1a3b0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61  nalyzeAggList(Na
1a3c0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
1a3d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1a3e0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1a3f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1a400 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1a410 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1a420 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1a430 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1a440 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
1a450 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1a460 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1a470 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
1a480 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1a490 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1a4a0 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
1a4b0 6f 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20  ocate temporary 
1a4c0 75 73 65 20 72 65 67 69 73 74 65 72 73 20 64 75  use registers du
1a4d0 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
1a4e0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1a4f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50  ite3GetTempReg(P
1a500 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1a510 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
1a520 6d 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  mpReg==0 ){.    
1a530 72 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d  return ++pParse-
1a540 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  >nMem;.  }.  ret
1a550 75 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d  urn pParse->aTem
1a560 70 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e  pReg[--pParse->n
1a570 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64  TempReg];.}.void
1a580 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a590 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
1a5a0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
1a5b0 0a 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70  .  if( iReg && p
1a5c0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c  Parse->nTempReg<
1a5d0 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65  ArraySize(pParse
1a5e0 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20  ->aTempReg) ){. 
1a5f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 57 72     sqlite3ExprWr
1a600 69 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 70  itableRegister(p
1a610 50 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20  Parse, iReg);.  
1a620 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
1a630 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
1a640 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
1a650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1a660 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
1a670 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
1a680 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
1a690 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
1a6a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a6b0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
1a6c0 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
1a6d0 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
1a6e0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
1a6f0 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
1a700 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
1a710 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73  ( nReg<=n && !us
1a720 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1a730 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31  pParse, i, i+n-1
1a740 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  ) ){.    pParse-
1a750 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52  >iRangeReg += nR
1a760 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  eg;.    pParse->
1a770 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65  nRangeReg -= nRe
1a780 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
1a790 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  i = pParse->nMem
1a7a0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
1a7b0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  nMem += nReg;.  
1a7c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
1a7d0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
1a7e0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72  aseTempRange(Par
1a7f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1a800 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
1a810 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
1a820 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
1a830 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
1a840 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
1a850 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
1a860 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
1a870 0a 7d 0a                                         .}.