/ Hex Artifact Content
Login

Artifact 97545fa4058f86c67eb7cacadf60d2964300b00c:


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 35 20 32 30 30 39 2f 30 32 2f 32 33 20  .415 2009/02/23 
0220: 31 37 3a 33 33 3a 35 30 20 64 61 6e 69 65 6c 6b  17:33:50 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 20  em->colUsed;.   
7720: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 73 65 73 52   pNewItem->usesR
7730: 6f 77 69 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  owid = pOldItem-
7740: 3e 75 73 65 73 52 6f 77 69 64 3b 0a 20 20 7d 0a  >usesRowid;.  }.
7750: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
7760: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
7770: 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  IdListDup(sqlite
7780: 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
7790: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
77a0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
77b0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
77c0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
77d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
77e0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
77f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7800: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7810: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
7820: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
7830: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
7840: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7850: 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  w(db, p->nId*siz
7860: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
7870: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
7880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
7890: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
78a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
78b0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
78c0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
78d0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
78e0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
78f0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
7900: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
7910: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
7920: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
7930: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
7940: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7950: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
7960: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
7970: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
7980: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
7990: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
79a0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
79b0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
79c0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
79d0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
79e0: 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66  lect *pNew;.  if
79f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
7a00: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
7a10: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7a20: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
7a30: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
7a40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20   return 0;.  /* 
7a50: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
7a60: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
7a70: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
7a80: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
7a90: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
7aa0: 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63  list.  The logic
7ab0: 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65   in SELECT proce
7ac0: 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65 72  ssing that deter
7ad0: 6d 69 6e 65 73 0a 20 20 2a 2a 20 74 68 65 20 6e  mines.  ** the n
7ae0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
7af0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7b00: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
7b10: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 70 4e  ormation */.  pN
7b20: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
7b30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
7b40: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66  db, p->pEList, f
7b50: 6c 61 67 73 7c 45 58 50 52 44 55 50 5f 53 50 41  lags|EXPRDUP_SPA
7b60: 4e 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  N);.  pNew->pSrc
7b70: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
7b80: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
7b90: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
7ba0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
7bb0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
7bc0: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
7bd0: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
7be0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
7bf0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
7c00: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
7c10: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
7c20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7c30: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
7c40: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
7c50: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
7c60: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7c70: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
7c80: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
7c90: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
7ca0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
7cb0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
7cc0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61  , p->pPrior, fla
7cd0: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  gs);.  pNew->pLi
7ce0: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
7cf0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  rDup(db, p->pLim
7d00: 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  it, flags);.  pN
7d10: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
7d20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7d30: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61   p->pOffset, fla
7d40: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  gs);.  pNew->iLi
7d50: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
7d60: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >iOffset = 0;.  
7d70: 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d  pNew->selFlags =
7d80: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e   p->selFlags & ~
7d90: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
7da0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
7db0: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
7dc0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
7dd0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
7de0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
7df0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
7e00: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
7e10: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
7e20: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
7e30: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
7e40: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
7e50: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
7e60: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
7e70: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
7e80: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
7e90: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
7ea0: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
7eb0: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
7ec0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
7ed0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
7ee0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
7ef0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
7f00: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
7f10: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
7f20: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
7f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7f40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
7f50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
7f60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
7f70: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
7f80: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
7f90: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
7fa0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
7fb0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
7fc0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
7fd0: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
7fe0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
7ff0: 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
8000: 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20 74  AS keyword for t
8010: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
8020: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8030: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8040: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8050: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
8060: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8070: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
8080: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
8090: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
80a0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
80b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
80c0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
80d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
80e0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
80f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
8100: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
8110: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
8120: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
8130: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
8140: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52    a = sqlite3DbR
8150: 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74  ealloc(db, pList
8160: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
8170: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8180: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
8190: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
81a0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
81b0: 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73  >a = a;.    pLis
81c0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  t->nAlloc = sqli
81d0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
81e0: 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61 5b  db, a)/sizeof(a[
81f0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0]);.  }.  asser
8200: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
8210: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c  ;.  if( pExpr ||
8220: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74   pName ){.    st
8230: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8240: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
8250: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
8260: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
8270: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
8280: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
8290: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
82a0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
82b0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
82d0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  r = pExpr;.    p
82e0: 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
82f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8300: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
8310: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
8320: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
8330: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
8340: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
8350: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8360: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
8370: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
8380: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
8390: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
83a0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
83b0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
83c0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
83d0: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
83e0: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
83f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
8400: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
8410: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
8420: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
8430: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
8440: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
8450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8460: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
8470: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
8480: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8490: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
84a0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
84b0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
84c0: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
84d0: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
84e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
84f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
8500: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
8510: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
8520: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8530: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8540: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
8550: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
8560: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
8570: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
8580: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
8590: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
85a0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
85b0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
85c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
85d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
85e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
85f0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
8600: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8610: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
8620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
8630: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
8640: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
8650: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
8660: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
8670: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
8680: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
8690: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
86a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
86b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
86c0: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  (db, pItem->pExp
86d0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  r);.    sqlite3D
86e0: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
86f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
8700: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8710: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
8720: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8730: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
8740: 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
8750: 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  are Walker callb
8760: 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75 2e  acks.  Walker.u.
8770: 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a  pi is a pointer.
8780: 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ** to an integer
8790: 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
87a0: 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20 61  s are checking a
87b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
87c0: 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  see.** if it is 
87d0: 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 74  a constant.  Set
87e0: 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74 6f   *Walker.u.pi to
87f0: 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65 73   0 if the expres
8800: 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20 63  sion is.** not c
8810: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
8820: 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f  hese callback ro
8830: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
8840: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
8850: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
8860: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
8870: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a 2a  rIsConstant().**
8880: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8890: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
88a0: 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  n().**     sqlit
88b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
88c0: 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 0a  OrFunction().**.
88d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
88e0: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
88f0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
8900: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8910: 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72  .  /* If pWalker
8920: 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e 20  ->u.i is 3 then 
8930: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
8940: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
8950: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
8960: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
8970: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
8980: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74  n disqualifies t
8990: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
89a0: 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f  ** from being co
89b0: 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e  nsidered constan
89c0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c  t. */.  if( pWal
89d0: 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20 45  ker->u.i==3 && E
89e0: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
89f0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
8a00: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
8a10: 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20  lker->u.i = 0;. 
8a20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
8a30: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
8a40: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8a50: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
8a60: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
8a70: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
8a80: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
8a90: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
8aa0: 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65 72    ** and pWalker
8ab0: 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20 20  ->u.i==2 */.    
8ac0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
8ad0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
8ae0: 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72 65  ker->u.i==2 ) re
8af0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
8b00: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
8b10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
8b20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8b30: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
8b40: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
8b50: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
8b60: 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53  OLUMN:.#ifndef S
8b70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
8b80: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
8b90: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
8ba0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
8bb0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8bc0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
8bd0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      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 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64  K_EXISTS );.#end
8c00: 69 66 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  if.      testcas
8c10: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
8c20: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _ID );.      tes
8c30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
8c40: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
8c50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8c60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
8c70: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8c90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
8ca0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70  OLUMN );.      p
8cb0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
8cc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
8cd0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66  C_Abort;.    def
8ce0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
8cf0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
8d00: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e  .  }.}.static in
8d10: 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  t selectNodeIsCo
8d20: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
8d30: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
8d40: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
8d50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
8d60: 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72  Used);.  pWalker
8d70: 2d 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74  ->u.i = 0;.  ret
8d80: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d  urn WRC_Abort;.}
8d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
8da0: 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c  IsConst(Expr *p,
8db0: 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a   int initFlag){.
8dc0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
8dd0: 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  u.i = initFlag;.
8de0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
8df0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
8e00: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
8e10: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
8e20: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
8e30: 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  nt;.  sqlite3Wal
8e40: 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20  kExpr(&w, p);.  
8e50: 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a  return w.u.i;.}.
8e60: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
8e70: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8e80: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
8e90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
8ea0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
8eb0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
8ec0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
8ed0: 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a  ction calls..**.
8ee0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
8ef0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
8f00: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
8f10: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
8f20: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
8f30: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
8f40: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
8f50: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
8f60: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
8f70: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
8f80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
8f90: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
8fa0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
8fb0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b  prIsConst(p, 1);
8fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
8fd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8fe0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
8ff0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9000: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  s constant.** th
9010: 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69  at does no origi
9020: 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  nate from the ON
9030: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9040: 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20  s of a join..** 
9050: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
9060: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
9070: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
9080: 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f  lls or terms fro
9090: 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53  m.** an ON or US
90a0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69  ING clause..*/.i
90b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
90c0: 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
90d0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
90e0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
90f0: 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 3);.}../*.** W
9100: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
9110: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9120: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
9130: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
9140: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
9150: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
9160: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
9170: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
9180: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
9190: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
91a0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
91b0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
91c0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
91d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
91e0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
91f0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
9200: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
9210: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
9220: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
9230: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
9240: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
9250: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9260: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
9270: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
9280: 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  st(p, 2);.}../*.
9290: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
92a0: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
92b0: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
92c0: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
92d0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
92e0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
92f0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
9300: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
9310: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
9320: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
9330: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9340: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
9350: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
9360: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
9370: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
9380: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
9390: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
93a0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
93b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
93c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
93d0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
93e0: 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ue){.  int rc = 
93f0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  0;.  if( p->flag
9400: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
9410: 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d  ){.    *pValue =
9420: 20 70 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20   p->iTable;.    
9430: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9440: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
9450: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
9460: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  EGER: {.      rc
9470: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74   = sqlite3GetInt
9480: 33 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  32((char*)p->tok
9490: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 3b 0a 20  en.z, pValue);. 
94a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
94c0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  LUS: {.      rc 
94d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  = sqlite3ExprIsI
94e0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
94f0: 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   pValue);.      
9500: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9510: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9520: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
9530: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9540: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9550: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
9560: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
9570: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
9580: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
95a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
95b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  eak;.  }.  if( r
95c0: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  c ){.    p->op =
95d0: 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
95e0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
95f0: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d  IntValue;.    p-
9600: 3e 69 54 61 62 6c 65 20 3d 20 2a 70 56 61 6c 75  >iTable = *pValu
9610: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9620: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
9630: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
9640: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
9650: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
9660: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
9670: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
9680: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
9690: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
96a0: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
96b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
96c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
96d0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
96e0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
96f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9700: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
9710: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
9720: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9730: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
9740: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
9750: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
9760: 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20 74  enabled and.** t
9770: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9780: 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e 64  ent p exists and
9790: 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 69   is of the.** si
97a0: 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  mple form:.**.**
97b0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
97c0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
97d0: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  >.**.** If this 
97e0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
97f0: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
9800: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
9810: 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20 69  ng table.** or i
9820: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
9830: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
9840: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a  heremal table..*
9850: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
9860: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
9870: 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e 64  tatic int isCand
9880: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53 65  idateForInOpt(Se
9890: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
98a0: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70  ist *pSrc;.  Exp
98b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
98c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
98d0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
98e0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
98f0: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
9900: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
9910: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
9920: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
9930: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
9940: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
9950: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
9960: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
9970: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
9980: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
9990: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
99a0: 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e   0; /* No DISTIN
99b0: 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e  CT keyword and n
99c0: 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
99d0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69  tions */.  }.  i
99e0: 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
99f0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
9a00: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
9a10: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9a20: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
9a30: 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
9a50: 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  as no LIMIT clau
9a60: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  se */.  if( p->p
9a70: 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
9a80: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  0;.  if( p->pWhe
9a90: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
9ab0: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
9ac0: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
9ad0: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
9ae0: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
9af0: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
9b00: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
9b10: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
9b20: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
9b30: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
9b40: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
9b50: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
9b60: 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  /* FROM clause i
9b70: 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  s not a subquery
9b80: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
9b90: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
9ba0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
9bb0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54  turn 0;.  if( pT
9bc0: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  ab->pSelect ) re
9bd0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
9be0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
9bf0: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f  is not a view */
9c00: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
9c10: 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
9c20: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f  0;        /* FRO
9c30: 4d 20 63 6c 61 75 73 65 20 6e 6f 74 20 61 20 76  M clause not a v
9c40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
9c50: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
9c60: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
9c70: 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
9c80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
9c90: 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  * One column in 
9ca0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
9cb0: 2f 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  /.  if( pEList->
9cc0: 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
9cd0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
9ce0: 72 6e 20 30 3b 20 2f 2a 20 52 65 73 75 6c 74 20  rn 0; /* Result 
9cf0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  is a column */. 
9d00: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
9d10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9d20: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
9d30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9d40: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
9d50: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
9d60: 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e  n of the IN (...
9d70: 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 49  ) operator..** I
9d80: 74 27 73 20 6a 6f 62 20 69 73 20 74 6f 20 66 69  t's job is to fi
9d90: 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 20 62  nd or create a b
9da0: 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
9db0: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
9dc0: 0a 2a 2a 20 65 69 74 68 65 72 20 74 6f 20 74 65  .** either to te
9dd0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
9de0: 70 20 6f 66 20 74 68 65 20 28 2e 2e 2e 29 20 73  p of the (...) s
9df0: 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65  et or to iterate
9e00: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 69 74 73 20   through.** its 
9e10: 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e  members, skippin
9e20: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
9e30: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f  .** The cursor o
9e40: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 74 72  pened on the str
9e50: 75 63 74 75 72 65 20 28 64 61 74 61 62 61 73 65  ucture (database
9e60: 20 74 61 62 6c 65 2c 20 64 61 74 61 62 61 73 65   table, database
9e70: 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 72 20 65 70   index .** or ep
9e80: 68 65 72 6d 61 6c 20 74 61 62 6c 65 29 20 69 73  hermal table) is
9e90: 20 73 74 6f 72 65 64 20 69 6e 20 70 58 2d 3e 69   stored in pX->i
9ea0: 54 61 62 6c 65 20 62 65 66 6f 72 65 20 74 68 69  Table before thi
9eb0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9ec0: 6e 73 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ns..** The retur
9ed0: 6e 65 64 20 76 61 6c 75 65 20 69 6e 64 69 63 61  ned value indica
9ee0: 74 65 73 20 74 68 65 20 73 74 72 75 63 74 75 72  tes the structur
9ef0: 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f  e type, as follo
9f00: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49  ws:.**.**   IN_I
9f10: 4e 44 45 58 5f 52 4f 57 49 44 20 2d 20 54 68 65  NDEX_ROWID - The
9f20: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
9f30: 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  ed on a database
9f40: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
9f50: 49 4e 44 45 58 5f 49 4e 44 45 58 20 2d 20 54 68  INDEX_INDEX - Th
9f60: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
9f70: 6e 65 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ned on a databas
9f80: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  e index..**   IN
9f90: 5f 49 4e 44 45 58 5f 45 50 48 20 2d 20 20 20 54  _INDEX_EPH -   T
9fa0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
9fb0: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
9fc0: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
9fd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9fe0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
9ff0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
a000: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69  .**.** An existi
a010: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6d 61 79  ng structure may
a020: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
a030: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
a040: 66 20 74 68 65 20 73 69 6d 70 6c 65 0a 2a 2a 20  f the simple.** 
a050: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
a060: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
a070: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
a080: 2a 2a 20 49 66 20 70 72 4e 6f 74 46 6f 75 6e 64  ** If prNotFound
a090: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
a0a0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
a0b0: 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ure will be used
a0c0: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
a0d0: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
a0e0: 65 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67  embers, skipping
a0f0: 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e   any duplicates.
a100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   In this case an
a110: 0a 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61  .** epheremal ta
a120: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
a130: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
a140: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
a150: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
a160: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
a170: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
a180: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
a190: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
a1a0: 2a 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20  ** is unique by 
a1b0: 76 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73  virtue of a cons
a1c0: 74 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63  traint or implic
a1d0: 69 74 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  it index..**.** 
a1e0: 49 66 20 74 68 65 20 70 72 4e 6f 74 46 6f 75 6e  If the prNotFoun
a1f0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  d parameter is n
a200: 6f 74 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73  ot 0, then the s
a210: 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65  tructure will be
a220: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
a230: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
a240: 70 20 74 65 73 74 73 2e 20 49 6e 20 74 68 69 73  p tests. In this
a250: 20 63 61 73 65 20 61 6e 20 65 70 68 65 72 65 6d   case an epherem
a260: 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a  al table must .*
a270: 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73  * be used unless
a280: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20   <column> is an 
a290: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a2a0: 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  KEY or an index 
a2b0: 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64  can .** be found
a2c0: 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61   with <column> a
a2d0: 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20  s its left-most 
a2e0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  column..**.** Wh
a2f0: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
a300: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
a310: 6f 72 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  or set membershi
a320: 70 20 74 65 73 74 73 2c 20 74 68 65 20 75 73 65  p tests, the use
a330: 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 6b 6e  r.** needs to kn
a340: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
a350: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
a360: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20  contains an SQL 
a370: 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c 75 65 20 69  NULL .** value i
a380: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 72 72 65  n order to corre
a390: 63 74 6c 79 20 65 76 61 6c 75 61 74 65 20 65 78  ctly evaluate ex
a3a0: 70 72 65 73 73 69 6f 6e 73 20 6c 69 6b 65 20 22  pressions like "
a3b0: 58 20 49 4e 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a  X IN (Y, Z)"..**
a3c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 63   If there is a c
a3d0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 73  hance that the s
a3e0: 74 72 75 63 74 75 72 65 20 6d 61 79 20 63 6f 6e  tructure may con
a3f0: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
a400: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
a410: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
a420: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
a430: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
a440: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
a450: 20 74 6f 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e   to *prNotFound.
a460: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
a470: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
a480: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
a490: 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c  ns a.** NULL val
a4a0: 75 65 2c 20 74 68 65 6e 20 2a 70 72 4e 6f 74 46  ue, then *prNotF
a4b0: 6f 75 6e 64 20 69 73 20 6c 65 66 74 20 75 6e 63  ound is left unc
a4c0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
a4d0: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
a4e0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
a4f0: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
a500: 20 69 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c   in *prNotFound,
a510: 20 74 68 65 6e 0a 2a 2a 20 69 74 73 20 69 6e 69   then.** its ini
a520: 74 69 61 6c 20 76 61 6c 75 65 20 69 73 20 4e 55  tial value is NU
a530: 4c 4c 2e 20 49 66 20 74 68 65 20 73 74 72 75 63  LL. If the struc
a540: 74 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  ture does not re
a550: 6d 61 69 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  main constant.**
a560: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
a570: 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 28  n of the query (
a580: 69 2e 65 2e 20 74 68 65 20 73 65 74 20 69 73 20  i.e. the set is 
a590: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
a5a0: 2d 73 65 6c 65 63 74 29 2c 20 0a 2a 2a 20 74 68  -select), .** th
a5b0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
a5c0: 6c 6c 6f 63 61 74 65 64 20 72 65 67 69 73 74 65  llocated registe
a5d0: 72 20 69 73 20 72 65 73 65 74 20 74 6f 20 4e 55  r is reset to NU
a5e0: 4c 4c 20 65 61 63 68 20 74 69 6d 65 20 74 68 65  LL each time the
a5f0: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69   .** structure i
a600: 73 20 72 65 70 6f 70 75 6c 61 74 65 64 2e 20 54  s repopulated. T
a610: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a620: 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 76 64 62  aller to use vdb
a630: 65 20 63 6f 64 65 20 0a 2a 2a 20 65 71 75 69 76  e code .** equiv
a640: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 66 6f 6c  alent to the fol
a650: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
a660: 69 66 28 20 72 65 67 69 73 74 65 72 3d 3d 4e 55  if( register==NU
a670: 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20 20 68 61 73  LL ){.**     has
a680: 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73 74 20 69 66  _null = <test if
a690: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
a6a0: 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a  contains null>.*
a6b0: 2a 20 20 20 20 20 72 65 67 69 73 74 65 72 20 3d  *     register =
a6c0: 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20   1.**   }.**.** 
a6d0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
a6e0: 64 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 3c 74  d running the <t
a6f0: 65 73 74 20 69 66 20 64 61 74 61 20 73 74 72 75  est if data stru
a700: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e  cture contains n
a710: 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74 20 6d 6f 72  ull>.** test mor
a720: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 69 73 20  e often than is 
a730: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 23 69  necessary..*/.#i
a740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a750: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
a760: 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
a770: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
a780: 20 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 2a   Expr *pX, int *
a790: 70 72 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 53  prNotFound){.  S
a7a0: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20  elect *p;.  int 
a7b0: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  eType = 0;.  int
a7c0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
a7d0: 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75  nTab++;.  int mu
a7e0: 73 74 42 65 55 6e 69 71 75 65 20 3d 20 21 70 72  stBeUnique = !pr
a7f0: 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20  NotFound;..  /* 
a800: 54 68 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28  The follwing if(
a810: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20  ...) expression 
a820: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 53  is true if the S
a830: 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
a840: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72  .  ** simple for
a850: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
a860: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
a870: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20   FROM <table>.  
a880: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
a890: 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
a8a0: 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
a8b0: 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74 69  to use an existi
a8c0: 6e 67 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72  ng table.  ** or
a8d0: 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
a8e0: 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20  f generating an 
a8f0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
a900: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 28 45 78 70  .  */.  p = (Exp
a910: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
a920: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 3f   EP_xIsSelect) ?
a930: 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a   pX->x.pSelect :
a940: 20 30 29 3b 0a 20 20 69 66 28 20 69 73 43 61 6e   0);.  if( isCan
a950: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
a960: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
a970: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a980: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
a990: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
a9a0: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
a9b0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
a9c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
a9d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
a9e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
a9f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
aa00: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
aa10: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
aa20: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
aa30: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
aa40: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
aa50: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
aa60: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
aa70: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
aa80: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
aa90: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
aaa0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
aab0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
aac0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
aad0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
aae0: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
aaf0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
ab00: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
ab10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
ab20: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
ab30: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
ab40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
ab50: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
ab60: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
ab70: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
ab80: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
ab90: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
aba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
abb0: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
abc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
abd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
abe0: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
abf0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
ac00: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
ac10: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
ac20: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
ac30: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
ac40: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
ac50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
ac70: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
ac80: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
ac90: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
aca0: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
acb0: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
acc0: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
acd0: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
ace0: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
acf0: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
ad00: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
ad10: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
ad20: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
ad30: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
ad40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
ad50: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
ad60: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
ad70: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
ad80: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
ad90: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ada0: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
adb0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
adc0: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
add0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
ade0: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
adf0: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
ae00: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
ae10: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
ae20: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
ae30: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
ae40: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
ae50: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
ae60: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
ae70: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
ae80: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
ae90: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
aea0: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
aeb0: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
aec0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
aed0: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
aee0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
aef0: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
af00: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
af10: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
af20: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
af30: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
af40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
af50: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
af60: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
af70: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
af80: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
af90: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
afa0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
afb0: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
afc0: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
afd0: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
afe0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
aff0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
b000: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
b010: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
b020: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
b030: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
b040: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
b050: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
b060: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
b070: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
b080: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
b090: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
b0a0: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
b0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
b0c0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b0d0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
b0e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
b0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b100: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
b110: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
b120: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
b130: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
b140: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
b150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b160: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b170: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
b180: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
b190: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
b1a0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
b1b0: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
b1c0: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59 49      pKey,P4_KEYI
b1f0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
b200: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
b210: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
b220: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
b230: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
b240: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a 0a  N_INDEX_INDEX;..
b250: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b260: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b270: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
b280: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
b290: 64 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c  d && !pTab->aCol
b2a0: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29  [iCol].notNull )
b2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
b2c0: 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50  rNotFound = ++pP
b2d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
b2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b300: 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79 70 65    }..  if( eType
b310: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ==0 ){.    int r
b320: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b  MayHaveNull = 0;
b330: 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
b340: 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69  INDEX_EPH;.    i
b350: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 29 7b  f( prNotFound ){
b360: 0a 20 20 20 20 20 20 2a 70 72 4e 6f 74 46 6f 75  .      *prNotFou
b370: 6e 64 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c  nd = rMayHaveNul
b380: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
b390: 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  em;.    }else if
b3a0: 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  ( pX->pLeft->iCo
b3b0: 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48  lumn<0 && !ExprH
b3c0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 58  asAnyProperty(pX
b3d0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
b3e0: 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  ){.      eType =
b3f0: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b   IN_INDEX_ROWID;
b400: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b410: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
b420: 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79  pParse, pX, rMay
b430: 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d  HaveNull, eType=
b440: 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29  =IN_INDEX_ROWID)
b450: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b460: 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  X->iTable = iTab
b470: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
b480: 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Type;.}.#endif..
b490: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
b4a0: 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73  ode for scalar s
b4b0: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
b4c0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  s an expression.
b4d0: 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  ** and IN operat
b4e0: 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a  ors.  Examples:.
b4f0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43  **.**     (SELEC
b500: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
b510: 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79       -- subquery
b520: 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28  .**     EXISTS (
b530: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
b540: 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62     -- EXISTS sub
b550: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49  query.**     x I
b560: 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20  N (4,5,11)      
b570: 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70          -- IN op
b580: 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74  erator with list
b590: 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
b5a0: 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ide.**     x IN 
b5b0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
b5c0: 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72  )     -- IN oper
b5d0: 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65  ator with subque
b5e0: 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a  ry on the right.
b5f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20  **.** The pExpr 
b600: 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69  parameter descri
b610: 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  bes the expressi
b620: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
b630: 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61   the IN.** opera
b640: 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e  tor or subquery.
b650: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
b660: 74 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e  ter isRowid is n
b670: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78  on-zero, then ex
b680: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
b690: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
b6a0: 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  to be of the for
b6b0: 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f  m "<rowid> IN (?
b6c0: 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20  , ?, ?)", where 
b6d0: 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66  <rowid> is a ref
b6e0: 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d  erence.** to som
b6f0: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f  e integer key co
b700: 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20  lumn of a table 
b710: 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
b720: 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20  case, use an.** 
b730: 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f  intkey B-Tree to
b740: 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
b750: 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73  f IN(...) values
b760: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
b770: 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72  usual.** (slower
b780: 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  ) variable lengt
b790: 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a  h keys B-Tree..*
b7a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
b7b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76  _OMIT_SUBQUERY.v
b7c0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53  oid sqlite3CodeS
b7d0: 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73  ubselect(.  Pars
b7e0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
b7f0: 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e  pr *pExpr, .  in
b800: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 0a  t rMayHaveNull,.
b810: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 0a 29 7b    int isRowid.){
b820: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
b830: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
b850: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
b860: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
b870: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b880: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
b890: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b8a0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
b8b0: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
b8c0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
b8d0: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
b8e0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
b8f0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
b900: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
b910: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
b920: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
b930: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
b940: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
b950: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
b960: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
b970: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
b980: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
b990: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
b9a0: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
b9b0: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
b9c0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
b9d0: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
b9e0: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
b9f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
ba00: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
ba10: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
ba20: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
ba30: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
ba40: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
ba50: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
ba60: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
ba70: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
ba80: 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73  elect) && !pPars
ba90: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
baa0: 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b      int mem = ++
bab0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
bac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bad0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65  Op1(v, OP_If, me
bae0: 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72  m);.    testAddr
baf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bb00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
bb10: 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20  er, 1, mem);.   
bb20: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
bb30: 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  r>0 || pParse->d
bb40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bb50: 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
bb60: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
bb70: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
bb80: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
bb90: 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49  nity;.      KeyI
bba0: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20  nfo keyInfo;.   
bbb0: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
bbc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
bbd0: 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  f OP_OpenEphemer
bbe0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
bbf0: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
bc00: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
bc10: 66 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  ft;..      if( r
bc20: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20  MayHaveNull ){. 
bc30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bc40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bc50: 75 6c 6c 2c 20 30 2c 20 72 4d 61 79 48 61 76 65  ull, 0, rMayHave
bc60: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Null);.      }..
bc70: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
bc80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
bc90: 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20  nity(pLeft);..  
bca0: 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
bcb0: 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
bcc0: 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
bcd0: 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
bce0: 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
bcf0: 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
bd00: 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
bd10: 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74  way. A virtual t
bd20: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
bd30: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
bd40: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
bd50: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
bd60: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
bd70: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
bd80: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
bd90: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
bda0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
bdb0: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
bdc0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
bdd0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
bde0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
bdf0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
be00: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
be10: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
be20: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
be30: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
be40: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
be50: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
be60: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
be70: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
be80: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
be90: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
bea0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
beb0: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
bec0: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
bed0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
bee0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
bef0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
bf00: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
bf10: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
bf20: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
bf30: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
bf40: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
bf50: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
bf60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
bf70: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
bf80: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
bf90: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
bfa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bfb0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
bfc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
bfd0: 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
bfe0: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
bff0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
c000: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
c010: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
c020: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
c030: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c040: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
c050: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
c060: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
c070: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
c080: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c090: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
c0a0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
c0b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
c0c0: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
c0d0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
c0e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
c0f0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
c100: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
c110: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
c120: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c130: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c140: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
c150: 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
c160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c170: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
c180: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
c190: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
c1a0: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69         dest.affi
c1b0: 6e 69 74 79 20 3d 20 28 75 38 29 61 66 66 69 6e  nity = (u8)affin
c1c0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
c1d0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
c1e0: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
c1f0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
c200: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
c210: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c220: 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
c230: 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
c240: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c250: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c260: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
c270: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
c280: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
c290: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
c2a0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20  ist->nExpr>0 ){ 
c2b0: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
c2c0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  fo.aColl[0] = sq
c2d0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
c2e0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
c2f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
c310: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c320: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
c340: 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20  pr->x.pList ){. 
c350: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
c360: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
c370: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
c380: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46   **.        ** F
c390: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
c3a0: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
c3b0: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
c3c0: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
c3d0: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
c3e0: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
c3f0: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
c400: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
c410: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
c420: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
c430: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
c440: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
c450: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
c460: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
c470: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
c480: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
c490: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c4a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
c4b0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
c4c0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
c4d0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
c4e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c4f0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
c500: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
c510: 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  3;..        if( 
c520: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
c530: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
c540: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
c550: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
c560: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
c570: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
c580: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
c590: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c5a0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
c5b0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
c5c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
c5d0: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
c5e0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
c5f0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c600: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
c610: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c620: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
c630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c640: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
c650: 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
c660: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
c670: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
c680: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
c690: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
c6a0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
c6b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
c6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
c6d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
c6e0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
c6f0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
c700: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
c710: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
c720: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
c730: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
c740: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
c750: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
c760: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
c770: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
c780: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
c790: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
c7a0: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
c7b0: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
c7c0: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
c7d0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c7e0: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
c7f0: 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45  ddr && !sqlite3E
c800: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
c810: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
c820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c830: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73  ngeToNoop(v, tes
c840: 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20  tAddr-1, 2);.   
c850: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
c860: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
c870: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
c880: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
c890: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
c8a0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
c8b0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
c8c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
c8d0: 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
c8e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33 20  +;.          r3 
c8f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
c900: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
c910: 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
c920: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
c930: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
c940: 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  che>0 );.       
c950: 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
c960: 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20  leColCache--;.. 
c970: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
c980: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
c990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c9a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
c9b0: 42 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74  BeInt, r3, sqlit
c9c0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c9d0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
c9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c9f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
ca00: 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
ca10: 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
ca20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ca30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ca40: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ca50: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33  P_MakeRecord, r3
ca60: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
ca70: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
ca80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ca90: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
caa0: 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
cab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
cac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cad0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
cae0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
caf0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r2);.          
cb00: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
cb10: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
cb20: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
cb30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
cb40: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
cb50: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
cb60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cb70: 69 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a  if( !isRowid ){.
cb80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cb90: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
cba0: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65  ddr, (void *)&ke
cbb0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
cbc0: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
cbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
cbe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
cbf0: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
cc00: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
cc10: 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  /* This has to b
cc20: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
cc30: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
cc40: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
cc50: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
cc60: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
cc70: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
cc80: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
cc90: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
cca0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
ccb0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
ccc0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
ccd0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20  const Token one 
cce0: 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c  = { (u8*)"1", 0,
ccf0: 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65   1 };.      Sele
cd00: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20  ct *pSel;.      
cd10: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
cd20: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
cd30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
cd40: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
cd50: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
cd60: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
cd70: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
cd80: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
cd90: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
cda0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
cdb0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
cdc0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
cdd0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
cde0: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
cdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ce00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
ce10: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  ll, 0, dest.iPar
ce20: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
ce30: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
ce40: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
ce50: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
ce60: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
ce70: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
ce80: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
ce90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cea0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
ceb0: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
cec0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
ced0: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
cee0: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
cef0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
cf00: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
cf10: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
cf20: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
cf30: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
cf40: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cf50: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
cf60: 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20   0, &one);.     
cf70: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
cf80: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
cf90: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
cfa0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
cfb0: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
cfc0: 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69  iColumn = dest.i
cfd0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  Parm;.      brea
cfe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
cff0: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
d000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d010: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
d020: 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72  ddr-1);.  }..  r
d030: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
d040: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
d050: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
d060: 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
d070: 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
d080: 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
d090: 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
d0a0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
d0b0: 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
d0c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
d0d0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
d0e0: 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
d0f0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
d100: 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
d110: 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
d120: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d130: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
d140: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
d150: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
d160: 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
d170: 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
d180: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
d190: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
d1a0: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
d1b0: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
d1c0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
d1d0: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
d1e0: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
d1f0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
d200: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
d210: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
d220: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
d230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
d240: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
d250: 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
d260: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
d270: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e  *z, int n, int n
d280: 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
d290: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
d2a0: 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c  z || v==0 || sql
d2b0: 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d  ite3VdbeDb(v)->m
d2c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
d2d0: 20 61 73 73 65 72 74 28 20 21 7a 20 7c 7c 20 21   assert( !z || !
d2e0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
d2f0: 5b 6e 5d 29 20 29 3b 0a 20 20 55 4e 55 53 45 44  [n]) );.  UNUSED
d300: 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0a 20  _PARAMETER(n);. 
d310: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f   if( z ){.    do
d320: 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
d330: 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
d340: 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
d350: 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  lue);.    if( sq
d360: 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
d370: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
d380: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d390: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Null, 0, iMem
d3a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d3b0: 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
d3c0: 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
d3d0: 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20  lue;.      zV = 
d3e0: 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
d3f0: 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
d400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d410: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
d420: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
d430: 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20 20 7d   P4_REAL);.    }
d440: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
d450: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
d460: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
d470: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
d480: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
d490: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
d4a0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
d4b0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
d4c0: 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
d4d0: 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
d4e0: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
d4f0: 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
d500: 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
d510: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
d520: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
d530: 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
d540: 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
d550: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
d560: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
d570: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
d580: 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45 78  be *v, Expr *pEx
d590: 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
d5a0: 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 63 6f   int iMem){.  co
d5b0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
d5c0: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
d5d0: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
d5e0: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
d5f0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
d600: 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
d610: 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
d620: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d630: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
d640: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  em);.  }else if(
d650: 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78   (z = (char*)pEx
d660: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30 20  pr->token.z)!=0 
d670: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d680: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
d690: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61 73  >token.n;.    as
d6a0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
d6b0: 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20  digit(z[n]) );. 
d6c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
d6d0: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
d6e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
d6f0: 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20  ag ) i = -i;.   
d700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d710: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d720: 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
d730: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
d740: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
d750: 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  z, negFlag) ){. 
d760: 20 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a       i64 value;.
d770: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
d780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f        sqlite3Ato
d790: 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  i64(z, &value);.
d7a0: 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
d7b0: 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
d7c0: 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20 64  ue;.      zV = d
d7d0: 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61  up8bytes(v, (cha
d7e0: 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  r*)&value);.    
d7f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d800: 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c  Op4(v, OP_Int64,
d810: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
d820: 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
d830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 64  }else{.      cod
d840: 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e  eReal(v, z, n, n
d850: 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20  egFlag, iMem);. 
d860: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
d870: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
d880: 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
d890: 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
d8a0: 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
d8b0: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
d8c0: 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
d8d0: 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
d8e0: 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f 72 74  ster.  An effort
d8f0: 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 73  .** is made to s
d900: 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  tore the column 
d910: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
d920: 72 20 69 52 65 67 2c 20 62 75 74 20 74 68 69 73  r iReg, but this
d930: 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61   is.** not guara
d940: 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f 63 61  nteed.  The loca
d950: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75  tion of the colu
d960: 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  mn value is retu
d970: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rned..**.** Ther
d980: 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
d990: 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
d9a0: 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
d9b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
d9c0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
d9d0: 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
d9e0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
d9f0: 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
da00: 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  e rowid..**.** T
da10: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
da20: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 75  t attempt to reu
da30: 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
da40: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a  the column that.
da50: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
da60: 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  een loaded into 
da70: 61 20 72 65 67 69 73 74 65 72 2e 20 20 54 68 65  a register.  The
da80: 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61   value will alwa
da90: 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20 69 66  ys.** be used if
daa0: 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e 64 65   it has not unde
dab0: 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69 6e 69  rgone any affini
dac0: 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42 75 74  ty changes.  But
dad0: 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69   if.** an affini
dae0: 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
daf0: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
db00: 20 63 61 63 68 65 64 20 76 61 6c 75 65 20 77 69   cached value wi
db10: 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ll only be.** us
db20: 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66 43 68  ed if allowAffCh
db30: 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  ng is true..*/.i
db40: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
db50: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
db60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
db70: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
db80: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
db90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
dba0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
dbb0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
dbc0: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
dbd0: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
dbe0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
dbf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
dc00: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
dc10: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
dc30: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
dc40: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
dc50: 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
dc60: 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
dc70: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61   here */.  int a
dc80: 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a 20 54  llowAffChng /* T
dc90: 72 75 65 20 69 66 20 70 72 69 6f 72 20 61 66 66  rue if prior aff
dca0: 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20 61 72  inity changes ar
dcb0: 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  e OK */.){.  Vdb
dcc0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
dcd0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
dce0: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
dcf0: 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  e *p;..  for(i=0
dd00: 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
dd10: 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73 65 2d  Cache; i<pParse-
dd20: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c  >nColCache; i++,
dd30: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
dd40: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
dd50: 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d   && p->iColumn==
dd60: 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20  iColumn.        
dd70: 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66 43 68     && (!p->affCh
dd80: 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66  ange || allowAff
dd90: 43 68 6e 67 29 20 29 7b 0a 23 69 66 20 30 0a 20  Chng) ){.#if 0. 
dda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ddb0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
ddc0: 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
ddd0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20  mment((v, "OPT: 
dde0: 74 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72  tab%d.col%d -> r
ddf0: 25 64 22 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  %d", iTable, iCo
de00: 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b  lumn, p->iReg));
de10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
de20: 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
de30: 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
de40: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
de50: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
de60: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
de70: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
de80: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
de90: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
dea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
deb0: 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c  Op2(v, op, iTabl
dec0: 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  e, iReg);.  }els
ded0: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
dee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
def0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
df00: 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  umn, iTable, iCo
df10: 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
df20: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
df30: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
df40: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
df50: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
df60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df70: 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  p3(v, op, iTable
df80: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
df90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
dfa0: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
dfb0: 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69  ab, iColumn);.#i
dfc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dfd0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
dfe0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
dff0: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
e000: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
e010: 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20  F_REAL ){.      
e020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e030: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
e040: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 20  nity, iReg);.   
e050: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
e060: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  if( pParse->disa
e070: 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
e080: 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72 73 65  {.    i = pParse
e090: 2d 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->iColCache;.   
e0a0: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43   p = &pParse->aC
e0b0: 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20  olCache[i];.    
e0c0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
e0d0: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  le;.    p->iColu
e0e0: 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = iColumn;.  
e0f0: 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
e100: 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68 61 6e  ;.    p->affChan
e110: 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  ge = 0;.    i++;
e120: 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61  .    if( i>=Arra
e130: 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 43  ySize(pParse->aC
e140: 6f 6c 43 61 63 68 65 29 20 29 20 69 20 3d 20 30  olCache) ) i = 0
e150: 3b 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  ;.    if( i>pPar
e160: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20  se->nColCache ) 
e170: 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68  pParse->nColCach
e180: 65 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 72 73  e = i;.    pPars
e190: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 69  e->iColCache = i
e1a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
e1b0: 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
e1c0: 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
e1d0: 61 63 68 65 20 65 6e 74 72 69 65 73 20 61 73 73  ache entries ass
e1e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
e1f0: 20 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20   vdbe.** cursor 
e200: 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75 6d 62  with cursor numb
e210: 65 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  er iTable..*/.vo
e220: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  id sqlite3ExprCl
e230: 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50  earColumnCache(P
e240: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e250: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28  t iTable){.  if(
e260: 20 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20   iTable<0 ){.   
e270: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
e280: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  he = 0;.    pPar
e290: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20  se->iColCache = 
e2a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
e2b0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e2c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
e2d0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
e2e0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
e2f0: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54  >aColCache[i].iT
e300: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e310: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
e320: 28 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f  ( i==pParse->nCo
e330: 6c 43 61 63 68 65 2d 31 20 29 3b 0a 20 20 20 20  lCache-1 );.    
e340: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c      pParse->aCol
e350: 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73  Cache[i] = pPars
e360: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70  e->aColCache[--p
e370: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
e380: 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ];.        pPars
e390: 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 70  e->iColCache = p
e3a0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
e3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e3c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
e3d0: 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
e3e0: 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
e3f0: 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
e400: 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
e410: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
e420: 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
e430: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e440: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
e450: 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
e460: 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
e470: 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
e480: 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74 61 72  int iEnd = iStar
e490: 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a  t + iCount - 1;.
e4a0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
e4b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
e4c0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
e4d0: 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73     int r = pPars
e4e0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
e4f0: 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
e500: 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d 69 45  =iStart && r<=iE
e510: 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  nd ){.      pPar
e520: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
e530: 2e 61 66 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a  .affChange = 1;.
e540: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
e550: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e560: 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
e570: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
e580: 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
e590: 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
e5a0: 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
e5b0: 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
e5c0: 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
e5d0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e5e0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
e5f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
e600: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e610: 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
e620: 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f  nt i;.  if( iFro
e630: 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b  m==iTo ) return;
e640: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e650: 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
e660: 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
e670: 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
e680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
e690: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
e6a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  i++){.    int x 
e6b0: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
e6c0: 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20  che[i].iReg;.   
e6d0: 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20 26 26   if( x>=iFrom &&
e6e0: 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20 29 7b   x<iFrom+nReg ){
e6f0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
e700: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
e710: 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b 0a 20   += iTo-iFrom;. 
e720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e730: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e740: 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e 74 20  to copy content 
e750: 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
e760: 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
e770: 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
e780: 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 0a  To..iTo+nReg-1..
e790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e7a0: 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61 72 73  xprCodeCopy(Pars
e7b0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e7c0: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69  From, int iTo, i
e7d0: 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
e7e0: 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
e7f0: 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
e800: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 67 3b  for(i=0; i<nReg;
e810: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
e820: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
e830: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43  rse->pVdbe, OP_C
e840: 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20 69 54  opy, iFrom+i, iT
e850: 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  o+i);.  }.}../*.
e860: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
e870: 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
e880: 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
e890: 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
e8a0: 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
e8b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
e8c0: 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  umn cache..*/.st
e8d0: 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
e8e0: 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
e8f0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
e900: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
e910: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
e920: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
e930: 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
e940: 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65    int r = pParse
e950: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
e960: 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
e970: 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
e980: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
e990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e9a0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20  *.** There is a 
e9b0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
e9c0: 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 57 65  r iReg..**.** We
e9d0: 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 6d 6f   are going to mo
e9e0: 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 2c 20  dify the value, 
e9f0: 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  so we need to ma
ea00: 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20 69 73  ke sure it.** is
ea10: 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20 72 65   not a cached re
ea20: 67 69 73 74 65 72 2e 20 20 49 66 20 69 52 65 67  gister.  If iReg
ea30: 20 69 73 20 61 20 63 61 63 68 65 64 20 72 65 67   is a cached reg
ea40: 69 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 63  ister,.** then c
ea50: 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65 73 70  lear the corresp
ea60: 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e  onding cache lin
ea70: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
ea80: 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65  e3ExprWritableRe
ea90: 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
eaa0: 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
eab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
eac0: 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
ead0: 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
eae0: 69 52 65 67 29 20 29 7b 0a 20 20 20 20 66 6f 72  iReg) ){.    for
eaf0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
eb00: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
eb10: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
eb20: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
eb30: 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
eb40: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
eb50: 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
eb60: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d  rse->aColCache[-
eb70: 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  -pParse->nColCac
eb80: 68 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61  he];.        pPa
eb90: 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
eba0: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
ebb0: 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  he;.      }.    
ebc0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
ebd0: 66 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72  f the last instr
ebe0: 75 63 74 69 6f 6e 20 63 6f 64 65 64 20 69 73 20  uction coded is 
ebf0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63 6f 70  an ephemeral cop
ec00: 79 20 6f 66 20 61 6e 79 20 6f 66 0a 2a 2a 20 74  y of any of.** t
ec10: 68 65 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  he registers in 
ec20: 74 68 65 20 6e 52 65 67 20 72 65 67 69 73 74 65  the nReg registe
ec30: 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
ec40: 68 20 69 52 65 67 2c 20 74 68 65 6e 0a 2a 2a 20  h iReg, then.** 
ec50: 63 6f 6e 76 65 72 74 20 74 68 65 20 6c 61 73 74  convert the last
ec60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 72 6f   instruction fro
ec70: 6d 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 4f 50  m OP_SCopy to OP
ec80: 5f 43 6f 70 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  _Copy..*/.void s
ec90: 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
eca0: 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
ecb0: 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
ecc0: 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 61 64 64  nReg){.  int add
ecd0: 72 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  r;.  VdbeOp *pOp
ece0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
ecf0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ed00: 65 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  e;.  addr = sqli
ed10: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ed20: 64 72 28 76 29 3b 0a 20 20 70 4f 70 20 3d 20 73  dr(v);.  pOp = s
ed30: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
ed40: 76 2c 20 61 64 64 72 2d 31 29 3b 0a 20 20 61 73  v, addr-1);.  as
ed50: 73 65 72 74 28 20 70 4f 70 20 7c 7c 20 70 50 61  sert( pOp || pPa
ed60: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
ed70: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
ed80: 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  Op && pOp->opcod
ed90: 65 3d 3d 4f 50 5f 53 43 6f 70 79 20 26 26 20 70  e==OP_SCopy && p
eda0: 4f 70 2d 3e 70 31 3e 3d 69 52 65 67 20 26 26 20  Op->p1>=iReg && 
edb0: 70 4f 70 2d 3e 70 31 3c 69 52 65 67 2b 6e 52 65  pOp->p1<iReg+nRe
edc0: 67 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  g ){.    pOp->op
edd0: 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a  code = OP_Copy;.
ede0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
edf0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74  erate code to st
ee00: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
ee10: 20 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61   the iAlias-th a
ee20: 6c 69 61 73 20 69 6e 20 72 65 67 69 73 74 65 72  lias in register
ee30: 0a 2a 2a 20 74 61 72 67 65 74 2e 20 20 54 68 65  .** target.  The
ee40: 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
ee50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 45 78 70   is called, pExp
ee60: 72 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 74  r is evaluated t
ee70: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
ee80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 6c   value of the al
ee90: 69 61 73 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ias.  The value 
eea0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20  is stored in an 
eeb0: 61 75 78 69 6c 69 61 72 79 20 72 65 67 69 73 74  auxiliary regist
eec0: 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75  er.** and the nu
eed0: 6d 62 65 72 20 6f 66 20 74 68 61 74 20 72 65 67  mber of that reg
eee0: 69 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  ister is returne
eef0: 64 2e 20 20 4f 6e 20 73 75 62 73 65 71 75 65 6e  d.  On subsequen
ef00: 74 20 63 61 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20  t calls,.** the 
ef10: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
ef20: 69 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  is returned with
ef30: 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61  out generating a
ef40: 6e 79 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ny code..**.** N
ef50: 6f 74 65 20 74 68 61 74 20 69 6e 20 6f 72 64 65  ote that in orde
ef60: 72 20 66 6f 72 20 74 68 69 73 20 74 6f 20 77 6f  r for this to wo
ef70: 72 6b 2c 20 63 6f 64 65 20 6d 75 73 74 20 62 65  rk, code must be
ef80: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
ef90: 65 0a 2a 2a 20 73 61 6d 65 20 6f 72 64 65 72 20  e.** same order 
efa0: 74 68 61 74 20 69 74 20 69 73 20 65 78 65 63 75  that it is execu
efb0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73  ted..**.** Alias
efc0: 65 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  es are numbered 
efd0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 31 2e  starting with 1.
efe0: 20 20 53 6f 20 69 41 6c 69 61 73 20 69 73 20 69    So iAlias is i
eff0: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f  n the range.** o
f000: 66 20 31 20 74 6f 20 70 50 61 72 73 65 2d 3e 6e  f 1 to pParse->n
f010: 41 6c 69 61 73 20 69 6e 63 6c 75 73 69 76 65 2e  Alias inclusive.
f020: 20 20 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 2d    .**.** pParse-
f030: 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
f040: 5d 20 72 65 63 6f 72 64 73 20 74 68 65 20 72 65  ] records the re
f050: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
f060: 65 72 65 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  ere the value.**
f070: 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73 2d 74   of the iAlias-t
f080: 68 20 61 6c 69 61 73 20 69 73 20 73 74 6f 72 65  h alias is store
f090: 64 2e 20 20 49 66 20 7a 65 72 6f 2c 20 74 68 61  d.  If zero, tha
f0a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
f0b0: 0a 2a 2a 20 61 6c 69 61 73 20 68 61 73 20 6e 6f  .** alias has no
f0c0: 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6d 70 75  t yet been compu
f0d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
f0e0: 6e 74 20 63 6f 64 65 41 6c 69 61 73 28 50 61 72  nt codeAlias(Par
f0f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f100: 69 41 6c 69 61 73 2c 20 45 78 70 72 20 2a 70 45  iAlias, Expr *pE
f110: 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
f120: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f140: 69 6e 74 20 69 52 65 67 3b 0a 20 20 69 66 28 20  int iReg;.  if( 
f150: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c  pParse->nAliasAl
f160: 6c 6f 63 3c 70 50 61 72 73 65 2d 3e 6e 41 6c 69  loc<pParse->nAli
f170: 61 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  as ){.    pParse
f180: 2d 3e 61 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->aAlias = sqlit
f190: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
f1a0: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 41  e(db, pParse->aA
f1b0: 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lias,.          
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
f1e0: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29  arse->aAlias[0])
f1f0: 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20  *pParse->nAlias 
f200: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
f210: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f220: 64 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 41 6c  d && pParse->nAl
f230: 69 61 73 41 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20  iasAlloc>0 );.  
f240: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f250: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
f260: 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  0;.    memset(&p
f270: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 70 50  Parse->aAlias[pP
f280: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
f290: 63 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  c], 0,.         
f2a0: 20 20 28 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61    (pParse->nAlia
f2b0: 73 2d 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  s-pParse->nAlias
f2c0: 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28 70 50  Alloc)*sizeof(pP
f2d0: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30 5d 29  arse->aAlias[0])
f2e0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
f2f0: 41 6c 69 61 73 41 6c 6c 6f 63 20 3d 20 70 50 61  AliasAlloc = pPa
f300: 72 73 65 2d 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d  rse->nAlias;.  }
f310: 0a 20 20 61 73 73 65 72 74 28 20 69 41 6c 69 61  .  assert( iAlia
f320: 73 3e 30 20 26 26 20 69 41 6c 69 61 73 3c 3d 70  s>0 && iAlias<=p
f330: 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b  Parse->nAlias );
f340: 0a 20 20 69 52 65 67 20 3d 20 70 50 61 72 73 65  .  iReg = pParse
f350: 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
f360: 31 5d 3b 0a 20 20 69 66 28 20 69 52 65 67 3d 3d  1];.  if( iReg==
f370: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
f380: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
f390: 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 69 52  ache ){.      iR
f3a0: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
f3b0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
f3c0: 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
f3d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f3e0: 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61      iReg = ++pPa
f3f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f400: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f410: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
f420: 69 52 65 67 29 3b 0a 20 20 20 20 20 20 70 50 61  iReg);.      pPa
f430: 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69  rse->aAlias[iAli
f440: 61 73 2d 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20  as-1] = iReg;.  
f450: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f460: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
f470: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
f480: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
f490: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
f4a0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
f4b0: 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70  ression.  Attemp
f4c0: 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  t to store the r
f4d0: 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
f4e0: 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20  er "target"..** 
f4f0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
f500: 74 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74  ter where result
f510: 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  s are stored..**
f520: 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f  .** With this ro
f530: 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20  utine, there is 
f540: 6e 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  no guarantee tha
f550: 74 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a  t results will.*
f560: 2a 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  * be stored in t
f570: 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
f580: 6c 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72  lt might be stor
f590: 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ed in some other
f5a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20  .** register if 
f5b0: 69 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  it is convenient
f5c0: 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20   to do so.  The 
f5d0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
f5e0: 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74  .** must check t
f5f0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
f600: 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75  nd move the resu
f610: 6c 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72  lts to the desir
f620: 65 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a  ed.** register..
f630: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
f640: 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72  prCodeTarget(Par
f650: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
f660: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
f670: 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
f680: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f690: 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65    /* The VM unde
f6a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
f6b0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f6d0: 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e   The opcode bein
f6e0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
f6f0: 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
f700: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
f710: 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
f720: 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20  ster inReg */.  
f730: 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
f740: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
f750: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
f760: 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
f770: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
f780: 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20  egFree2 = 0;    
f790: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
f7a0: 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65  ero free this te
f7b0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
f7c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   */.  int r1, r2
f7d0: 2c 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20  , r3, r4;       
f7e0: 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73  /* Various regis
f7f0: 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ter numbers */. 
f800: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
f810: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
f820: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
f830: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
f840: 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  iled );.  assert
f850: 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
f860: 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
f870: 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  em );.  if( v==0
f880: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
f890: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
f8a0: 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
f8b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
f8c0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
f8d0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
f8e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f8f0: 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
f900: 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
f910: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
f920: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
f930: 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
f940: 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
f950: 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
f960: 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
f970: 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
f980: 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
f990: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
f9a0: 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
f9b0: 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
f9c0: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
f9d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
f9e0: 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
f9f0: 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
fa00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fa10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fa20: 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
fa30: 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
fa60: 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
fa70: 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
fa80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
fa90: 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
faa0: 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
fab0: 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
fac0: 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
fad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
fae0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
faf0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
fb00: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
fb10: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
fb20: 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
fb30: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
fb40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fb50: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
fb60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
fb70: 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
fb80: 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
fb90: 42 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Base;.      }els
fba0: 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e{.        testc
fbb0: 61 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61  ase( (pExpr->fla
fbc0: 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21  gs & EP_AnyAff)!
fbd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  =0 );.        in
fbe0: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
fbf0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
fc00: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54  Parse, pExpr->pT
fc10: 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
fc40: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
fc50: 6c 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  le, target,.    
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
fc80: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41  pr->flags & EP_A
fc90: 6e 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  nyAff);.      }.
fca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fcb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
fcc0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
fcd0: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70  codeInteger(v, p
fce0: 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29  Expr, 0, target)
fcf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fd00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fd10: 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
fd20: 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61  codeReal(v, (cha
fd30: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
fd40: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
fd50: 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  n, 0, target);. 
fd60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd70: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  }.    case TK_ST
fd80: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  RING: {.      sq
fd90: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
fda0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
fdb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fdc0: 64 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67  dOp4(v,OP_String
fdd0: 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c  8, 0, target, 0,
fde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fdf0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
fe00: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
fe10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
fe20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fe30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fe40: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
fe50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fe60: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
fe70: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
fe80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
fe90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
fea0: 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
feb0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a  case TK_BLOB: {.
fec0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
fed0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fee0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  ;.      char *zB
fef0: 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lob;.      asser
ff00: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
ff10: 6e 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61 73  n>=3 );.      as
ff20: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
ff30: 65 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  en.z[0]=='x' || 
ff40: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  pExpr->token.z[0
ff50: 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
ff60: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
ff70: 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20  oken.z[1]=='\'' 
ff80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ff90: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
ffa0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31  pExpr->token.n-1
ffb0: 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20  ]=='\'' );.     
ffc0: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65   n = pExpr->toke
ffd0: 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a  n.n - 3;.      z
ffe0: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
fff0: 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20  >token.z + 2;.  
10000 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
10010 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
10020 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
10030 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
10040 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10050 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
10060 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
10070 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
10080 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10090 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
100a0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
100b0 20 20 20 20 20 20 69 6e 74 20 69 50 72 69 6f 72        int iPrior
100c0 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
100d0 70 4f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pOp;.      if( p
100e0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3c 3d 31  Expr->token.n<=1
100f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 69 50  .         && (iP
10100 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 56 64  rior = sqlite3Vd
10110 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10120 2d 31 29 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  -1)>=0.         
10130 26 26 20 28 70 4f 70 20 3d 20 73 71 6c 69 74 65  && (pOp = sqlite
10140 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 69 50  3VdbeGetOp(v, iP
10150 72 69 6f 72 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d  rior))->opcode==
10160 4f 50 5f 56 61 72 69 61 62 6c 65 0a 20 20 20 20  OP_Variable.    
10170 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
10180 70 4f 70 2d 3e 70 33 3d 3d 70 45 78 70 72 2d 3e  pOp->p3==pExpr->
10190 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
101a0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
101b0 70 33 3d 3d 74 61 72 67 65 74 0a 20 20 20 20 20  p3==target.     
101c0 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a      && pOp->p4.z
101d0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
101e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
101f0 72 65 76 69 6f 75 73 20 69 6e 73 74 72 75 63 74  revious instruct
10200 69 6f 6e 20 77 61 73 20 61 20 63 6f 70 79 20 6f  ion was a copy o
10210 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 75  f the previous u
10220 6e 6e 61 6d 65 64 0a 20 20 20 20 20 20 20 20 2a  nnamed.        *
10230 2a 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 6f  * parameter into
10240 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65   the previous re
10250 67 69 73 74 65 72 2c 20 74 68 65 6e 20 73 69 6d  gister, then sim
10260 70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ply increment th
10270 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70  e.        ** rep
10280 65 61 74 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65  eat count on the
10290 20 70 72 69 6f 72 20 69 6e 73 74 72 75 63 74 69   prior instructi
102a0 6f 6e 20 72 61 74 68 65 72 20 74 68 61 6e 20 6d  on rather than m
102b0 61 6b 69 6e 67 20 61 20 6e 65 77 0a 20 20 20 20  aking a new.    
102c0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
102d0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
102e0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b         pOp->p3++
102f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10310 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56  beAddOp3(v, OP_V
10320 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
10330 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c 20  iTable, target, 
10340 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10350 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
10360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10370 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
10380 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
10390 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
103a0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
103b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
103c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
103d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
103e0 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
103f0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
10400 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
10410 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10420 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
10430 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 63 6f        inReg = co
10440 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
10450 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
10460 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
10470 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
10480 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
10490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
104a0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  T.    case TK_CA
104b0 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ST: {.      /* E
104c0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
104d0 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70  e form:   CAST(p
104e0 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a  Left AS token) *
104f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c  /.      int aff,
10500 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 69 6e   to_op;.      in
10510 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
10520 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
10530 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10540 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
10550 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66   aff = sqlite3Af
10560 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70  finityType(&pExp
10570 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  r->token);.     
10580 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53   to_op = aff - S
10590 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b  QLITE_AFF_TEXT +
105a0 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20   OP_ToText;.    
105b0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
105c0 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c  =OP_ToText    ||
105d0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
105e0 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20  _TEXT    );.    
105f0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10600 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c  =OP_ToBlob    ||
10610 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
10620 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20  _NONE    );.    
10630 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10640 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c  =OP_ToNumeric ||
10650 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
10660 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
10670 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
10680 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c  =OP_ToInt     ||
10690 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
106a0 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
106b0 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d    assert( to_op=
106c0 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c  =OP_ToReal    ||
106d0 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46   aff!=SQLITE_AFF
106e0 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20  _REAL    );.    
106f0 20 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f    testcase( to_o
10700 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 29 3b 0a  p==OP_ToText );.
10710 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10720 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
10730 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10740 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
10750 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20 20 20 20  Numeric );.     
10760 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
10770 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b 0a 20 20  ==OP_ToInt );.  
10780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
10790 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 29  _op==OP_ToReal )
107a0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
107b0 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
107c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
107d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
107e0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
107f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
10800 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
10810 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10820 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74  3VdbeAddOp1(v, t
10830 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  o_op, inReg);.  
10840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73      testcase( us
10850 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
10860 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69  pParse, inReg, i
10870 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73  nReg) );.      s
10880 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
10890 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
108a0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b  arse, inReg, 1);
108b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108c0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
108d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
108e0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
108f0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
10900 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
10910 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
10920 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
10930 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
10940 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
10950 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
10960 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10970 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
10980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10990 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
109a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
109b0 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
109c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
109d0 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
109e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
109f0 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  P_Ne );.      te
10a00 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
10a10 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
10a20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
10a30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
10a40 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
10a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
10a60 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
10a70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10a80 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
10a90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
10aa0 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  NE );.      code
10ab0 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
10ac0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10ad0 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
10ae0 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
10b10 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
10b20 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
10b30 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
10b40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10b50 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
10b60 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
10b70 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
10b80 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
10b90 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  P2);.      testc
10ba0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
10bb0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10bc0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
10bd0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10be0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10bf0 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  K_AND:.    case 
10c00 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  TK_OR:.    case 
10c10 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  TK_PLUS:.    cas
10c20 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63  e TK_STAR:.    c
10c30 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20  ase TK_MINUS:.  
10c40 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20    case TK_REM:. 
10c50 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
10c60 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  D:.    case TK_B
10c70 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  ITOR:.    case T
10c80 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73  K_SLASH:.    cas
10c90 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20  e TK_LSHIFT:.   
10ca0 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
10cb0 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f   .    case TK_CO
10cc0 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  NCAT: {.      as
10cd0 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50  sert( TK_AND==OP
10ce0 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _And );.      as
10cf0 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
10d00 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
10d10 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f  rt( TK_PLUS==OP_
10d20 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Add );.      ass
10d30 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f  ert( TK_MINUS==O
10d40 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20  P_Subtract );.  
10d50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
10d60 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
10d70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10d80 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
10d90 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  BitAnd );.      
10da0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
10db0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20  ==OP_BitOr );.  
10dc0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
10dd0 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
10de0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10df0 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
10e00 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20  hiftLeft );.    
10e10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
10e20 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
10e30 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ht );.      asse
10e40 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
10e50 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20  P_Concat );.    
10e60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
10e70 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
10e80 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
10e90 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _OR );.      tes
10ea0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
10eb0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
10ec0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e  case( op==TK_MIN
10ed0 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  US );.      test
10ee0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
10ef0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
10f00 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e  se( op==TK_BITAN
10f10 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
10f20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
10f30 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  R );.      testc
10f40 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
10f50 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  H );.      testc
10f60 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
10f70 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  FT );.      test
10f80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48  case( op==TK_RSH
10f90 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  IFT );.      tes
10fa0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
10fb0 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
10fc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10fd0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
10fe0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
10ff0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
11000 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
11010 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
11020 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
11030 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
11040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11050 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
11060 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11070 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
11080 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
11090 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
110a0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
110b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
110c0 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
110d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
110e0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
110f0 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
11100 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
11110 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
11120 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
11130 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
11140 28 63 68 61 72 2a 29 70 4c 65 66 74 2d 3e 74 6f  (char*)pLeft->to
11150 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f  ken.z, pLeft->to
11160 6b 65 6e 2e 6e 2c 20 31 2c 20 74 61 72 67 65 74  ken.n, 1, target
11170 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
11180 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
11190 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
111a0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
111b0 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  v, pLeft, 1, tar
111c0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  get);.      }els
111d0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46 72  e{.        regFr
111e0 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69 74  ee1 = r1 = sqlit
111f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11200 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
11210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11220 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11230 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 72  , r1);.        r
11240 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
11250 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
11260 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
11270 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
11280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11290 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
112a0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
112b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
112c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
112d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
112e0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
112f0 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
11300 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11310 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
11320 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
11330 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
11340 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
11350 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11360 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
11370 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11380 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
11390 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
113a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
113b0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
113c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
113d0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
113e0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
113f0 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
11400 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
11410 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
11420 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
11430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11440 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
11450 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
11460 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11470 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
11480 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
11490 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
114a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
114b0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
114c0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
114d0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
114e0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
114f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11500 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
11510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11520 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20   op==TK_NOTNULL 
11530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11550 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
11560 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  get);.      r1 =
11570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11580 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
11590 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
115a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
115b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
115c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
115d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
115e0 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b  dOp1(v, op, r1);
115f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11600 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
11610 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d  ddImm, target, -
11620 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
11630 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11640 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72   addr);.      br
11650 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11660 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
11670 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  ION: {.      Agg
11680 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45  Info *pInfo = pE
11690 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
116a0 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d       if( pInfo==
116b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
116c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
116d0 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
116e0 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a  aggregate: %T",.
116f0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78              &pEx
11700 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  pr->span);.     
11710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11720 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61  inReg = pInfo->a
11730 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
11740 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ].iMem;.      }.
11750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11760 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
11770 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
11780 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
11790 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
117a0 74 20 2a 70 4c 69 73 74 20 3d 20 28 0a 20 20 20  t *pList = (.   
117b0 20 20 20 20 20 45 78 70 72 48 61 73 41 6e 79 50       ExprHasAnyP
117c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
117d0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
117e0 70 61 6e 4f 6e 6c 79 29 20 3f 20 30 20 3a 20 70  panOnly) ? 0 : p
117f0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 0a 20 20  Expr->x.pList.  
11800 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 6e 74      );.      int
11810 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
11820 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
11830 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
11840 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
11850 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
11860 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
11870 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
11880 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
11890 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
118a0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
118b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
118c0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
118d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
118e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
118f0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
11900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
11910 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20  ==TK_CONST_FUNC 
11920 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11930 65 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  e( op==TK_FUNCTI
11940 4f 4e 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  ON );.      zId 
11950 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
11960 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
11970 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
11980 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
11990 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
119a0 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e  ction(db, zId, n
119b0 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20  Id, nExpr, enc, 
119c0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
119d0 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
119e0 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
119f0 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20          nExpr = 
11a00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
11a10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
11a20 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11a30 50 61 72 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20  Parse, nExpr);. 
11a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
11a50 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
11a60 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 31  Parse, pList, r1
11a70 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
11a80 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72  e{.        nExpr
11a90 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20   = r1 = 0;.     
11aa0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11ab0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11ac0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
11ad0 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
11ae0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
11af0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
11b00 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
11b10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
11b20 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
11b30 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
11b40 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
11b50 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
11b60 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
11b70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
11b80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
11b90 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
11ba0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
11bb0 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
11bc0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
11bd0 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
11be0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
11bf0 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
11c00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
11c10 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
11c20 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
11c30 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
11c40 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
11c50 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
11c60 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
11c70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11c80 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
11c90 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
11ca0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
11cb0 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
11cc0 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
11cd0 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
11ce0 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
11cf0 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
11d00 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
11d10 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
11d20 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
11d30 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
11d40 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
11d50 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
11d60 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32      if( nExpr>=2
11d70 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
11d80 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
11d90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
11da0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
11db0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
11dc0 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
11dd0 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
11de0 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
11df0 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a   if( nExpr>0 ){.
11e00 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
11e10 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
11e20 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  adFunction(db, p
11e30 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73  Def, nExpr, pLis
11e40 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
11e50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
11e60 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11e70 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
11e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11e90 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
11ea0 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b  nstant(pList->a[
11eb0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
11ec0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
11ed0 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
11ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
11ef0 28 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26  ( (pDef->flags &
11f00 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
11f10 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43  DCOLL)!=0 && !pC
11f20 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
11f30 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
11f40 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
11f50 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
11f60 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
11f70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11f80 69 66 28 20 70 44 65 66 2d 3e 66 6c 61 67 73 20  if( pDef->flags 
11f90 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
11fa0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
11fb0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
11fc0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
11fd0 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
11fe0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ff0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
12000 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
12010 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
12020 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
12030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12040 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
12050 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
12060 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
12090 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
120a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
120b0 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
120c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
120d0 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   nExpr ){.      
120e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
120f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
12100 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20  , r1, nExpr);.  
12110 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12120 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
12130 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
12140 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
12150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12160 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12170 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
12180 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
12190 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
121a0 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
121b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
121c0 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
121d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
121e0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
121f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
12200 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
12210 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
12220 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
12230 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
12240 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
12250 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
12260 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  n;.      break;.
12270 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12280 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
12290 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b  t rNotFound = 0;
122a0 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79 48  .      int rMayH
122b0 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
122c0 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20 6a     int j2, j3, j
122d0 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68 61  4, j5;.      cha
122e0 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
122f0 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
12300 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12310 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
12320 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61 72  N expr r%d", tar
12330 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54 79  get));.      eTy
12340 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
12350 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
12360 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76 65  pExpr, &rMayHave
12370 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Null);.      if(
12380 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29 7b   rMayHaveNull ){
12390 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f 75  .        rNotFou
123a0 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
123b0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Mem;.      }..  
123c0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
123d0 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
123e0 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
123f0 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
12400 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
12410 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
12420 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
12430 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
12440 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
12450 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f  or.      ** P4 o
12460 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
12470 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12480 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
12490 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
124a0 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a  xpr);...      /*
124b0 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
124c0 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
124d0 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
124e0 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
124f0 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
12500 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
12510 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
12520 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
12530 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
12540 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
12550 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
12560 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12570 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
12580 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
12590 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
125a0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
125b0 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20 73  --;.      j2 = s
125c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
125d0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74  (v, OP_IsNull, t
125e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66  arget);.      if
125f0 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
12600 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
12610 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56     j3 = sqlite3V
12620 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12630 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67 65  MustBeInt, targe
12640 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d  t);.        j4 =
12650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12660 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
12670 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
12680 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  e, 0, target);. 
12690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
126a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
126b0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
126c0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  t);.        j5 =
126d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126e0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
126f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12700 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
12710 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
12720 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12730 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20  v, j4);.        
12740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12750 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12760 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
12770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12780 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32 20    r2 = regFree2 
12790 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
127a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
127b0 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
127c0 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65 73  a record and tes
127d0 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65 72  t for set member
127e0 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65 74  ship. If the set
127f0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
12800 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c 20    ** the value, 
12810 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12820 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74   end of the test
12830 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67 65   code. The targe
12840 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 67  t.        ** reg
12850 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e 74  ister still cont
12860 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28 31  ains the true (1
12870 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  ) value written 
12880 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a 20  to it earlier.. 
12890 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
128a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128b0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
128c0 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31 2c  cord, target, 1,
128d0 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20   r2, &affinity, 
128e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
128f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12900 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12910 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
12920 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
12930 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
12940 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
12950 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20 20  le, 0, r2);..   
12960 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
12970 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
12980 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  st fails, then t
12990 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
129a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78 20   .        ** "x 
129b0 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
129c0 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
129d0 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
129e0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
129f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12a00 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12a10 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12a20 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12a30 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
12a40 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
12a50 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
12a60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
12a70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
12a80 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
12a90 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
12aa0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
12ab0 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a 20  NotFound==0 ){. 
12ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
12ad0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
12ae0 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63  it is known at c
12af0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f 77  ompile time (now
12b00 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  ) that .        
12b10 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f 6e    ** the set con
12b20 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61  tains no NULL va
12b30 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
12b40 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
12b50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
12b60 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   a "NOT NULL" co
12b70 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20  nstraint in the 
12b80 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
12b90 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 20   No need.       
12ba0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
12bb0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
12bc0 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20 74   at runtime in t
12bd0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
12be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12c10 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
12c20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12c30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
12c40 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20 74  lock populates t
12c50 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65 67  he rNotFound reg
12c60 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68 65  ister with eithe
12c70 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  r NULL.         
12c80 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e 74   ** or 0 (an int
12c90 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66 20  eger value). If 
12ca0 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
12cb0 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 0a  re contains one.
12cc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
12cd0 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65 6e  more NULLs, then
12ce0 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20 74   set rNotFound t
12cf0 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  o NULL. Otherwis
12d00 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20 20  e, set it.      
12d10 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66 20      ** to 0. If 
12d20 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61 76  register rMayHav
12d30 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64 79  eNull is already
12d40 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
12d50 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ue.          ** 
12d60 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c 2c  other than NULL,
12d70 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20 68   then the test h
12d80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
12d90 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20 20  run and .       
12da0 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64 20     ** rNotFound 
12db0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
12dc0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ated..          
12dd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  */.          sta
12de0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e  tic const char n
12df0 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b 20  ullRecord[] = { 
12e00 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x02, 0x00 };.  
12e10 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
12e20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12e30 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 4d  , OP_NotNull, rM
12e40 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20  ayHaveNull);.   
12e50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12e60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12e70 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ull, 0, rNotFoun
12e80 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
12e90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12ea0 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20 72  v, OP_Blob, 2, r
12eb0 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c 20  MayHaveNull, 0, 
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
12ee0 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54 41  llRecord, P4_STA
12ef0 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
12f00 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j4 = sqlite3Vdbe
12f10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75  AddOp3(v, OP_Fou
12f20 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
12f30 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75  e, 0, rMayHaveNu
12f40 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ll);.          s
12f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12f60 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12f70 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20  0, rNotFound);. 
12f80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12f90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12fa0 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  j4);.          s
12fb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12fc0 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20 20  re(v, j3);..    
12fd0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
12fe0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
12ff0 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28 77  ter rNotFound (w
13000 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20 4e  hich is either N
13010 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20 20  ULL or 0).      
13020 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
13030 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72 2e  target register.
13040 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
13050 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
13060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
13070 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ression..       
13080 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130a0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 4e  2(v, OP_Copy, rN
130b0 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74 29  otFound, target)
130c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
130d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
130e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
130f0 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   j2);.      sqli
13100 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13110 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 56 64  v, j5);.      Vd
13120 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
13130 6e 64 20 49 4e 20 65 78 70 72 20 72 25 64 22 2c  nd IN expr r%d",
13140 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20 20   target));.     
13150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
13160 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ndif.    /*.    
13170 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
13180 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
13190 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
131a0 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
131b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
131c0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
131d0 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
131e0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
131f0 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
13200 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
13210 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
13220 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
13230 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
13240 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
13250 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
13260 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
13270 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
13280 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
13290 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
132a0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
132b0 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
132c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  ->x.pList->a;.  
132d0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
132e0 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
132f0 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  ;..      codeCom
13300 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61  pareOperands(pPa
13310 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c  rse, pLeft, &r1,
13320 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20   &regFree1,.    
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
13350 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
13360 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
13370 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
13380 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
13390 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
133a0 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
133b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
133c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
133d0 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
133e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
133f0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
13400 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
13410 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
13420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13430 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
13440 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
13450 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a        pLItem++;.
13460 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
13470 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
13480 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
13490 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
134a0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20  , regFree2);.   
134b0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
134c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
134d0 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67  se, pRight, &reg
134e0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
134f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
13500 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
13510 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
13520 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
13530 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
13540 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  4, SQLITE_STOREP
13550 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
13560 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13570 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
13580 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
13590 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
135a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
135b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
135c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
135d0 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
135e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
135f0 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
13600 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
13610 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13620 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
13630 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
13640 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
13650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
13660 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
13670 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
13680 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
13690 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
136a0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
136b0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
136c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
136d0 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
136e0 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
136f0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
13700 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
13710 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
13720 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
13730 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
13740 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
13750 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
13760 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
13770 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
13780 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
13790 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
137a0 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
137b0 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
137c0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
137d0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
137e0 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
137f0 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
13800 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
13810 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69  is in pExpr->pRi
13820 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61  ght.  The Y is a
13830 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
13840 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20  f there is no.  
13850 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65    ** ELSE clause
13860 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65   and no other te
13870 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e  rm matches, then
13880 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13890 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73  he.    ** exprss
138a0 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20  ion is NULL..   
138b0 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78   ** Ei is in pEx
138c0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
138d0 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70  ] and Ri is pExp
138e0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b  r->pList->a[i*2+
138f0 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  1]..    **.    *
13900 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
13910 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
13920 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65  s the Ri for the
13930 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
13940 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  Ei,.    ** or if
13950 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
13960 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c  ching Ei, the EL
13970 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66  SE term Y, or if
13980 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a   there is.    **
13990 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e   no ELSE term, N
139a0 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
139b0 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
139c0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
139d0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
139e0 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
139f0 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
13a00 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
13a10 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
13a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13a30 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
13a40 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
13a50 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
13a60 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
13a90 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
13aa0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
13ad0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
13ae0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
13af0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
13b00 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
13b10 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
13b20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13b30 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
13b40 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
13b50 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
13b60 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
13b70 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
13b80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
13b90 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
13ba0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61  */.      Expr ca
13bb0 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20  cheX;           
13bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
13bd0 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  ched expression 
13be0 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  X */.      Expr 
13bf0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e  The X expression
13c20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
13c30 70 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pTest = 0;      
13c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
13c50 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72  ==Ei (form A) or
13c60 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42   just Ei (form B
13c70 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  ) */..      asse
13c80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
13c90 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
13ca0 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
13cb0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
13cc0 20 20 20 20 20 61 73 73 65 72 74 28 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 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
13cf0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
13d00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
13d10 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
13d20 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
13d30 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
13d40 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
13d50 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
13d60 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
13d70 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
13d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13d90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13da0 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
13db0 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
13dc0 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20         cacheX = 
13dd0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
13de0 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
13df0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e  K_COLUMN || pX->
13e00 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
13e10 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
13e20 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
13e30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
13e40 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
13e50 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
13e60 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13e70 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
13e80 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
13e90 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
13ea0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
13eb0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
13ec0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
13ed0 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
13ee0 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
13ef0 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pare;.      }.  
13f00 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
13f10 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
13f20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13f30 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
13f40 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
13f50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13f60 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
13f70 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
13f80 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
13f90 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
13fa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13fb0 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
13fc0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
13fd0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
13fe0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
13ff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14000 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14010 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
14020 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
14030 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  N || pTest->op==
14040 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
14050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
14060 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14070 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
14080 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
14090 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
140a0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
140b0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
140c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
140d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
140e0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
140f0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
14100 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
14110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14120 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
14130 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
14140 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
14150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14160 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14170 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
14180 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14190 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
141a0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
141b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
141c0 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
141d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
141e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
141f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
14200 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
14210 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14230 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
14240 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
14250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14260 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
14270 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
14280 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14290 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
142a0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
142b0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
142c0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
142d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
142e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
142f0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
14300 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
14310 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
14320 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
14330 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14340 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
14370 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
14380 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
14390 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
143a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
143b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
143c0 2d 3e 61 66 66 69 6e 69 74 79 21 3d 4f 45 5f 49  ->affinity!=OE_I
143d0 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
143e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
143f0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
14400 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
14410 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14420 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
14430 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
14440 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14450 2d 3e 61 66 66 69 6e 69 74 79 20 3d 3d 20 4f 45  ->affinity == OE
14460 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
14470 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
14480 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 29 3b  Expr(db, pExpr);
14490 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
144a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
144b0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
144c0 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72  ONSTRAINT, pExpr
144d0 2d 3e 61 66 66 69 6e 69 74 79 2c 20 30 2c 0a 20  ->affinity, 0,. 
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
14500 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
14510 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
14520 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
14530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14540 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
14550 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
14560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14570 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14580 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
14590 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
145a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
145c0 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
145d0 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
145e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
145f0 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e  t((v, "raise(IGN
14600 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
14610 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14620 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
14630 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14640 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14650 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
14660 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14670 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
14680 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
14690 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
146a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
146b0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
146c0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
146d0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
146e0 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
146f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
14700 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
14710 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
14720 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
14730 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
14740 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
14750 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
14760 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
14770 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
14780 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
14790 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
147a0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
147b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
147c0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
147d0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
147e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
147f0 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
14800 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
14810 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
14820 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
14830 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14840 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
14850 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
14860 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
14870 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
14880 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
14890 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
148a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
148b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
148c0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
148d0 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d    *pReg = 0;.  }
148e0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
148f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14900 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
14910 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
14920 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
14930 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
14940 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
14950 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
14960 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
14970 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
14980 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
14990 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
149a0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
149b0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
149c0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
149d0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
149e0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
149f0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
14a00 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
14a10 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
14a20 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
14a30 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
14a40 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
14a50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
14a60 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
14a70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
14a80 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
14a90 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
14aa0 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
14ab0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
14ac0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
14ad0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
14ae0 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  et);.  }.  retur
14af0 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n target;.}../*.
14b00 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14b10 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
14b20 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
14b30 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
14b40 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
14b50 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
14b60 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
14b70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
14b80 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
14b90 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
14ba0 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
14bb0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
14bc0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
14bd0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
14be0 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
14bf0 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
14c00 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
14c10 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
14c20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14c30 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
14c40 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
14c50 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
14c60 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
14c70 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
14c80 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
14c90 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
14ca0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
14cb0 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reused..*/.int s
14cc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
14cd0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
14ce0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
14cf0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
14d00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
14d10 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
14d20 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20   inReg;.  inReg 
14d30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14d40 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
14d50 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
14d60 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
14d70 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
14d80 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20  =TK_REGISTER ){ 
14d90 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
14da0 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
14db0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
14dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14dd0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
14de0 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
14df0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
14e00 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
14e10 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
14e20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
14e30 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
14e40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
14e50 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
14e60 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
14e70 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
14e80 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
14e90 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
14ea0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
14eb0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
14ec0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
14ed0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
14ee0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
14ef0 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
14f00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
14f10 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
14f20 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
14f30 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
14f40 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
14f50 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
14f60 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
14f70 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
14f80 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
14f90 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
14fa0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
14fb0 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
14fc0 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
14fd0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
14fe0 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
14ff0 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
15000 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
15010 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
15020 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
15030 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
15040 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
15050 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
15060 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
15070 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
15080 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
15090 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
150a0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
150b0 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
150c0 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
150d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
150e0 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
150f0 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
15100 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
15110 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
15120 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
15130 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
15140 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
15150 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
15160 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
15170 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
15180 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
15190 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
151a0 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
151b0 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
151c0 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
151d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
151e0 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
151f0 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
15200 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
15210 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
15220 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
15230 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
15240 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
15250 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
15260 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15270 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
15280 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
15290 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
152a0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
152b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
152c0 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
152d0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
152e0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
152f0 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
15300 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
15310 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
15320 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
15330 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
15340 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
15350 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
15360 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
15370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15380 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
15390 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
153a0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
153b0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
153c0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
153d0 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
153e0 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
153f0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
15400 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
15410 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
15420 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
15430 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
15440 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
15450 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
15460 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
15470 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
15480 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
15490 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
154a0 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
154b0 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
154c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
154d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
154e0 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
154f0 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e    if( p->pLeft->
15500 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
15510 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
15520 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
15530 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
15540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 62        }.       b
15550 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15560 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15570 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15580 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
15590 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
155a0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
155b0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
155c0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
155d0 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
155e0 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
155f0 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
15600 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
15610 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
15620 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
15630 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
15640 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
15650 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
15660 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
15670 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
15680 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
15690 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
156a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
156b0 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
156c0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
156d0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
156e0 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
156f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15700 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
15710 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
15720 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
15730 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
15740 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
15750 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
15760 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
15770 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
15780 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
15790 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
157a0 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
157b0 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
157c0 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
157d0 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
157e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
157f0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
15800 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
15810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
15820 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
15830 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
15840 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
15850 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
15860 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
15870 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
15880 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
15890 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c  item *pItem = pL
158a0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
158b0 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  for(; i>0; i--, 
158c0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
158d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
158e0 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70 45  Expr ) pItem->pE
158f0 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
15900 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20  _FixedDest;.    
15910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15930 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70  .  }.  if( isApp
15940 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
15950 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20  ring(pExpr) ){. 
15960 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50     int r1 = ++pP
15970 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
15980 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d  int r2;.    r2 =
15990 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
159a0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
159b0 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
159c0 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c 69  f( r1!=r2 ) sqli
159d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
159e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
159f0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
15a00 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
15a10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
15a20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  r2;.    return W
15a30 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
15a40 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
15a50 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  nue;.}../*.** Pr
15a60 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61  eevaluate consta
15a70 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  nt subexpression
15a80 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61  s within pExpr a
15a90 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
15aa0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
15ab0 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45  ters.  Modify pE
15ac0 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  xpr so that the 
15ad0 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
15ae0 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b  esions.** are TK
15af0 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65  _REGISTER opcode
15b00 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
15b10 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20  the precomputed 
15b20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  values..*/.void 
15b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
15b40 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
15b50 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15b60 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
15b70 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
15b80 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45  ack = evalConstE
15b90 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  xpr;.  w.xSelect
15ba0 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Callback = 0;.  
15bb0 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
15bc0 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
15bd0 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
15be0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
15bf0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
15c00 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
15c10 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
15c20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
15c30 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
15c40 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20  into a sequence 
15c50 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67  of registers beg
15c60 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74  inning at target
15c70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
15c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
15c90 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e  ments evaluated.
15ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
15cb0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
15cc0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15cd0 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
15ce0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
15cf0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
15d00 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
15d10 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
15d20 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72  ded */.  int tar
15d30 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  get,        /* W
15d40 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65  here to write re
15d50 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64  sults */.  int d
15d60 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a  oHardCopy     /*
15d70 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70   Make a hard cop
15d80 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  y of every eleme
15d90 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  nt */.){.  struc
15da0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
15db0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
15dc0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   n;.  assert( pL
15dd0 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ist!=0 );.  asse
15de0 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
15df0 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
15e00 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
15e10 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
15e20 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
15e30 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ){.    if( pItem
15e40 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->iAlias ){.    
15e50 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f 64    int iReg = cod
15e60 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
15e70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70 49  Item->iAlias, pI
15e80 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67  tem->pExpr, targ
15e90 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  et+i);.      Vdb
15ea0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15eb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15ec0 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74       if( iReg!=t
15ed0 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20  arget+i ){.     
15ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
15f00 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b 69  , iReg, target+i
15f10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
15f30 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15f40 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
15f50 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
15f60 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61 72   }.    if( doHar
15f70 64 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73  dCopy ){.      s
15f80 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f  qlite3ExprHardCo
15f90 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65  py(pParse, targe
15fa0 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t, n);.    }.  }
15fb0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
15fc0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15fd0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
15fe0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
15ff0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
16000 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
16010 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
16020 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16030 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
16040 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
16050 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
16060 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
16070 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
16080 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
16090 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
160a0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
160b0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
160c0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
160d0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
160e0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
160f0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
16100 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
16110 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
16120 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
16130 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
16140 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
16150 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
16160 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
16170 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
16180 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
16190 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
161a0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
161b0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
161c0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
161d0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
161e0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
161f0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
16200 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
16210 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
16220 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
16230 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
16240 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
16250 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
16260 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
16270 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
16280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
16290 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
162a0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
162b0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
162c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
162d0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
162e0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
162f0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
16300 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
16310 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
16320 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
16330 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
16340 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
16350 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
16360 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
16370 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  n;.  op = pExpr-
16380 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
16390 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
163a0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
163b0 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
163c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
163d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
163e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
163f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16400 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
16410 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
16420 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16430 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
16440 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
16450 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
16460 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
16470 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
16480 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
16490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
164a0 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
164b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
164c0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
164d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
164e0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
164f0 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
16500 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
16510 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
16520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16530 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16540 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
16550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16560 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
16570 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
16580 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
16590 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73   testcase( pPars
165a0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
165b0 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  he==0 );.      s
165c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
165d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
165e0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
165f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
16600 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16610 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
16620 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
16630 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
16640 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
16650 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
16660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
16670 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
16680 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
16690 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
166a0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
166b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
166c0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
166d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
166e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
166f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16700 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16710 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
16720 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16730 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16740 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16750 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
16760 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
16770 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
16780 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
16790 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
167a0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
167b0 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
167c0 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
167d0 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
167e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
167f0 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
16800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
16810 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
16820 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16830 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
16840 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
16850 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
16860 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16870 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
16880 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
16890 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
168a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
168b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
168c0 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
168d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
168e0 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
168f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16900 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_NE );.      t
16910 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
16920 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
16930 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61  codeCompareOpera
16940 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  nds(pParse, pExp
16950 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26  r->pLeft, &r1, &
16960 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20  regFree1,.      
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
16990 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20  r->pRight, &r2, 
169a0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
169b0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
169c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
169d0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
169e0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
169f0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16a00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
16a10 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
16a20 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
16a30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16a40 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16a50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16a60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16a70 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
16a80 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
16a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16aa0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
16ab0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
16ac0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
16ad0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
16ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16af0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==TK_ISNULL );. 
16b00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
16b10 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
16b20 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
16b30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16b40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16b50 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16b70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
16b80 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
16b90 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16ba0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16bb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16bc0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
16bd0 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20  N: {.      /*   
16be0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
16bf0 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   z.      **.    
16c00 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65    ** Is equivale
16c10 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a  nt to .      **.
16c20 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79        **    x>=y
16c30 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20   AND x<=z.      
16c40 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65  **.      ** Code
16c50 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
16c60 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
16c70 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
16c80 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
16c90 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
16ca0 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   x..      */.   
16cb0 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b     Expr exprAnd;
16cc0 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
16cd0 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
16ce0 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20   compRight;.    
16cf0 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20    Expr exprX;.. 
16d00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
16d10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16d20 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
16d30 74 29 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  t) );.      expr
16d40 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
16d50 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
16d60 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
16d70 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
16d80 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
16d90 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
16da0 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
16db0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
16dc0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
16dd0 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
16de0 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
16df0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
16e00 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
16e10 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
16e20 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
16e30 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20  op = TK_LE;.    
16e40 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
16e50 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
16e60 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
16e70 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
16e80 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
16e90 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61  .      exprX.iTa
16ea0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
16eb0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16ec0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
16ed0 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
16ee0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
16ef0 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 58  0 );.      exprX
16f00 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  .op = TK_REGISTE
16f10 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  R;.      testcas
16f20 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
16f30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16f40 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
16f50 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
16f60 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
16f70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16f80 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
16f90 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
16fa0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16fb0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
16fc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
16fd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16fe0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
16ff0 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
17000 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74  ull!=0);.      t
17010 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17020 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
17030 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
17040 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  ll==0 );.      b
17050 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17060 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17070 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17080 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
17090 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
170a0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
170b0 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
170c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
170d0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
170e0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
170f0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
17100 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
17110 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
17120 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
17130 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
17140 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
17150 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
17160 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
17170 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
17180 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
17190 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
171a0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
171b0 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
171c0 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
171d0 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
171e0 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
171f0 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
17200 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
17210 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17220 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
17230 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
17240 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
17250 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
17260 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17270 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17280 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
17290 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
172a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
172b0 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
172c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
172d0 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
172e0 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
172f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
17300 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
17310 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
17320 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
17330 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
17340 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
17350 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
17360 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
17370 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
17380 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
17390 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
173a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
173b0 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
173c0 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
173d0 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
173e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
173f0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
17400 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
17410 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
17420 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
17430 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
17440 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
17450 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
17460 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
17470 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
17480 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
17490 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
174a0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
174b0 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
174c0 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
174d0 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
174e0 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
174f0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
17500 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
17510 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
17520 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
17530 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
17540 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
17550 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
17560 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
17570 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
17580 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
17590 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
175a0 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
175b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
175c0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
175d0 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
175e0 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
175f0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
17600 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
17610 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
17620 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
17630 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
17640 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
17650 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17660 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
17670 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
17680 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
17690 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
176a0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
176b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
176c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
176d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
176e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
176f0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
17700 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
17710 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
17720 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
17730 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
17740 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
17750 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
17760 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
17770 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
17780 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
17790 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
177a0 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
177b0 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
177c0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
177d0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
177e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
177f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
17800 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17810 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  e( pParse->disab
17820 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b  leColCache==0 );
17830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17840 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17850 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17860 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
17870 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
17880 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
17890 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
178a0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
178b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
178c0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
178d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
178e0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
178f0 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
17900 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17910 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
17920 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  -;.      break;.
17930 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17940 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
17950 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
17960 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17980 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
17990 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
179a0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
179b0 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20  ColCache==0 );. 
179c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
179d0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
179e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
179f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
17a00 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17a10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
17a20 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
17a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17a40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17a50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17a60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
17a70 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
17a80 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
17a90 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
17aa0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
17ab0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
17ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ad0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17ae0 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
17af0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17b00 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
17b10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
17b20 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
17b30 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
17b40 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
17b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17b60 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
17b70 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
17b80 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
17b90 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
17ba0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
17bb0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
17bc0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
17bd0 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
17be0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17bf0 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
17c00 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17c10 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
17c20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17c30 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
17c40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
17c50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17c60 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
17c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17c80 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
17c90 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
17ca0 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
17cb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17cc0 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
17cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
17d00 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
17d10 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
17d20 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
17d30 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
17d40 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
17d70 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
17d80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17d90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
17da0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17db0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
17dc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17dd0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
17de0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
17df0 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  ULL: {.      tes
17e00 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
17e10 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65  NULL );.      te
17e20 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
17e30 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
17e40 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17e50 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17e60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
17e70 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17e80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e90 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
17ea0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
17eb0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
17ec0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
17ed0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17ee0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
17ef0 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57      /*    x BETW
17f00 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
17f10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73    **.      ** Is
17f20 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
17f30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17f40 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
17f50 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  =z.      **.    
17f60 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20    ** Code it as 
17f70 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72  such, taking car
17f80 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d  e to do the comm
17f90 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  on subexpression
17fa0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
17fb0 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20  tation of x..   
17fc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
17fd0 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20   exprAnd;.      
17fe0 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20  Expr compLeft;. 
17ff0 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69       Expr compRi
18000 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ght;.      Expr 
18010 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20 61 73  exprX;..      as
18020 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
18030 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
18040 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
18050 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45       exprX = *pE
18060 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
18070 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54    exprAnd.op = T
18080 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70  K_AND;.      exp
18090 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
180a0 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  mpLeft;.      ex
180b0 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26  prAnd.pRight = &
180c0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
180d0 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54   compLeft.op = T
180e0 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_GE;.      comp
180f0 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  Left.pLeft = &ex
18100 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  prX;.      compL
18110 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
18120 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
18130 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63  ].pExpr;.      c
18140 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b  ompRight.op = TK
18150 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  _LE;.      compR
18160 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78  ight.pLeft = &ex
18170 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  prX;.      compR
18180 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45  ight.pRight = pE
18190 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  xpr->x.pList->a[
181a0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
181b0 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73  exprX.iTable = s
181c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
181d0 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72  mp(pParse, &expr
181e0 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  X, &regFree1);. 
181f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18200 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18210 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54      exprX.op = T
18220 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
18230 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
18240 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
18250 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18260 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
18270 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
18280 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
18290 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
182a0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
182b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
182c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
182d0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
182e0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
182f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18300 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20  , OP_IfNot, r1, 
18310 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18320 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74  !=0);.      test
18330 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
18340 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
18350 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18360 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
18370 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
18380 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18390 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
183a0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
183b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
183c0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
183d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  );.}../*.** Do a
183e0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
183f0 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
18400 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
18410 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
18420 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  ).** if they are
18430 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72   identical and r
18440 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
18450 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
18460 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  y way..**.** Som
18470 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74  etimes this rout
18480 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
18490 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68  FALSE even if th
184a0 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  e two expression
184b0 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20  s.** really are 
184c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20  equivalent.  If 
184d0 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20  we cannot prove 
184e0 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
184f0 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e  ions are.** iden
18500 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e  tical, we return
18510 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62   FALSE just to b
18520 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
18530 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
18540 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68  eturns false, th
18550 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
18560 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
18570 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
18580 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
18590 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
185a0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
185b0 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65  TRUE return, the
185c0 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20  n you.** can be 
185d0 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73  sure the express
185e0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
185f0 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65  e.  In the place
18600 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20  s where.** this 
18610 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c  routine is used,
18620 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
18630 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72  t to get an extr
18640 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a  a FALSE - that.*
18650 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73  * just might res
18660 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67  ult in some slig
18670 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65  htly slower code
18680 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67  .  But returning
18690 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  .** an incorrect
186a0 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64   TRUE could lead
186b0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
186c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
186d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
186e0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
186f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
18700 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b   pA==0||pB==0 ){
18710 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d  .    return pB==
18720 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78  pA;.  }.  if( Ex
18730 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 41  prHasProperty(pA
18740 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
18750 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
18760 74 79 28 70 42 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pB, EP_xIsSel
18770 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
18780 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
18790 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
187a0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
187b0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
187c0 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nct) ) return 0;
187d0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
187e0 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
187f0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
18800 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
18810 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
18820 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18830 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
18840 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
18850 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
18860 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69  ) return 0;..  i
18870 66 28 20 70 41 2d 3e 78 2e 70 4c 69 73 74 20 26  f( pA->x.pList &
18880 26 20 70 42 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  & pB->x.pList ){
18890 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 78 2e 70  .    if( pA->x.p
188a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
188b0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
188c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
188d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 78  for(i=0; i<pA->x
188e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  .pList->nExpr; i
188f0 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
18900 2a 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 78 2e  *pExprA = pA->x.
18910 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
18920 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
18930 45 78 70 72 42 20 3d 20 70 42 2d 3e 78 2e 70 4c  ExprB = pB->x.pL
18940 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
18950 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
18960 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
18970 45 78 70 72 41 2c 20 70 45 78 70 72 42 29 20 29  ExprA, pExprB) )
18980 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18990 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 2d  .  }else if( pA-
189a0 3e 78 2e 70 4c 69 73 74 20 7c 7c 20 70 42 2d 3e  >x.pList || pB->
189b0 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  x.pList ){.    r
189c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
189d0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
189e0 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
189f0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
18a00 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
18a10 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
18a20 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
18a30 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
18a40 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
18a50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18a60 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
18a70 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
18a80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18a90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
18aa0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
18ab0 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
18ac0 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
18ad0 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
18ae0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18af0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18b00 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
18b10 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
18b20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
18b30 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
18b40 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
18b50 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
18b60 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
18b70 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
18b80 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
18b90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18ba0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
18bb0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
18bc0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
18bd0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
18be0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
18bf0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
18c00 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
18c10 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
18c20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
18c30 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
18c40 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
18c50 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
18c60 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
18c70 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
18c80 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
18c90 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
18ca0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
18cb0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
18cc0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
18cd0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
18ce0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
18cf0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
18d00 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
18d10 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
18d20 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
18d30 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
18d40 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
18d50 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
18d60 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
18d70 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
18d80 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
18d90 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
18da0 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
18db0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
18dc0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
18dd0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
18de0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
18df0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
18e00 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
18e10 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
18e20 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
18e30 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
18e40 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
18e50 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
18e60 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
18e70 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
18e80 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
18e90 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
18ea0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
18eb0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
18ec0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
18ed0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
18ee0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
18ef0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
18f00 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
18f10 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
18f20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
18f30 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
18f40 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
18f50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
18f60 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
18f70 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
18f80 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
18f90 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
18fa0 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
18fb0 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
18fc0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
18fd0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
18fe0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
18ff0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
19000 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
19010 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
19020 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
19030 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
19040 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
19050 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
19060 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
19070 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
19080 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
19090 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
190a0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
190b0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
190c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
190d0 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
190e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
190f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
19100 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
19110 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
19120 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
19130 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19140 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
19150 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
19160 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19170 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
19180 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
19190 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
191a0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
191b0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
191c0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
191d0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
191e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
191f0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
19200 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
19210 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
19220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
19230 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
19240 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
19250 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
19260 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
19270 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
19280 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
19290 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
192a0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
192b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
192c0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
192d0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
192e0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
192f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
19300 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
19310 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
19320 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
19330 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
19340 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
19350 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
19360 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
19370 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
19380 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
19390 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
193b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
193c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
193d0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
193e0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
193f0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
19400 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
19410 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
19420 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
19430 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
19440 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
19450 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
19460 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
19470 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
19480 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
19490 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
194a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
194b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
194c0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
194d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
194f0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
19500 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
19510 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
19520 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
19530 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
19540 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
19550 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
19560 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
19570 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
19590 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
195a0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
195b0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
195c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
195d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
195e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
195f0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
19600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19610 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
19620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19630 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
19640 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
19670 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
19680 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19690 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
196a0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
196b0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
196c0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
196d0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
196e0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
196f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
19700 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
19710 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
19720 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
19730 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
19760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19780 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
19790 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
197c0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
197d0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
197e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
197f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
19800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19810 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
19820 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
19830 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
19840 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
19850 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
19860 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
19870 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
19880 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
19890 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
198a0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
198b0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
198c0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
198d0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
198e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
198f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
19900 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
19910 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
19920 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
19930 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
19940 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
19950 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
19960 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
19970 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b  pExpr->iAgg = k;
19980 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
19990 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
199a0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
199b0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
199c0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
199d0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
199e0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
199f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19a00 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19a10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19a20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
19a30 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
19a40 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
19a50 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
19a60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
19a70 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
19a80 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
19a90 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
19aa0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
19ab0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
19ac0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
19ad0 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
19ae0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
19af0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
19b00 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
19b10 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
19b20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
19b30 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
19b40 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
19b50 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
19b60 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
19b70 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
19b80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
19b90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
19ba0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19bb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
19bc0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
19bd0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
19be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19bf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
19c00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19c10 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
19c20 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
19c30 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
19c40 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
19c50 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
19c60 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
19c70 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
19c80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
19c90 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
19ca0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
19cb0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
19cc0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
19cd0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
19ce0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
19cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
19d00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
19d10 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
19d20 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
19d30 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
19d40 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
19d50 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
19d60 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
19d70 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
19d80 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
19d90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19da0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
19db0 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
19dc0 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
19dd0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
19e00 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
19e10 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
19e20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
19e30 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
19e40 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
19e50 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
19e60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
19e70 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
19e80 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
19e90 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
19ea0 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
19eb0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
19ec0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
19ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19ee0 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
19ef0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
19f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
19f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19f20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
19f30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
19f40 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
19f50 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
19f60 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
19f70 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
19f80 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45   = i;.        pE
19f90 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20  xpr->pAggInfo = 
19fa0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
19fb0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
19fc0 6e 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ne;.      }.    
19fd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
19fe0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
19ff0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
1a000 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
1a010 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
1a020 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
1a030 6c 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  lect){.  NameCon
1a040 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c  text *pNC = pWal
1a050 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66  ker->u.pNC;.  if
1a060 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
1a070 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
1a080 70 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  pth++;.    sqlit
1a090 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
1a0a0 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
1a0b0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d      pNC->nDepth-
1a0c0 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  -;.    return WR
1a0d0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65  C_Prune;.  }else
1a0e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1a0f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d  _Continue;.  }.}
1a100 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
1a110 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1a120 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  sion looking for
1a130 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1a140 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
1a150 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e  variables that n
1a160 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20  eed to be added 
1a170 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
1a180 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20  Agg[] array..** 
1a190 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  Make additional 
1a1a0 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70  entries to the p
1a1b0 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
1a1c0 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
1a1d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1a1e0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
1a1f0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1a200 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1a210 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
1a220 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
1a230 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
1a240 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1a250 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1a260 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
1a270 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
1a280 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
1a290 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
1a2a0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
1a2b0 67 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53  ggregate;.  w.xS
1a2c0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1a2d0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1a2e0 73 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75  sInSelect;.  w.u
1a2f0 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71  .pNC = pNC;.  sq
1a300 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
1a310 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
1a320 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
1a330 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1a340 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
1a350 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1a360 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1a370 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
1a380 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1a390 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
1a3a0 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
1a3b0 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
1a3c0 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f  cut short..*/.vo
1a3d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  id sqlite3ExprAn
1a3e0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
1a3f0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
1a400 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1a410 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1a420 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a430 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1a440 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1a450 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
1a460 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1a470 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
1a480 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a490 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1a4a0 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65  egates(pNC, pIte
1a4b0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  m->pExpr);.    }
1a4c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1a4d0 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
1a4e0 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75  cate temporary u
1a4f0 73 65 20 72 65 67 69 73 74 65 72 73 20 64 75 72  se registers dur
1a500 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
1a510 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1a520 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61  te3GetTempReg(Pa
1a530 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1a540 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
1a550 70 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pReg==0 ){.    r
1a560 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1a570 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nMem;.  }.  retu
1a580 72 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  rn pParse->aTemp
1a590 52 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54  Reg[--pParse->nT
1a5a0 65 6d 70 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20  empReg];.}.void 
1a5b0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a5c0 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
1a5d0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
1a5e0 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
1a5f0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
1a600 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
1a610 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
1a620 20 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69    sqlite3ExprWri
1a630 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50  tableRegister(pP
1a640 61 72 73 65 2c 20 69 52 65 67 29 3b 0a 20 20 20  arse, iReg);.   
1a650 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1a660 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
1a670 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
1a680 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
1a690 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
1a6a0 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
1a6b0 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
1a6c0 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
1a6d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1a6e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
1a6f0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
1a700 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
1a710 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
1a720 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
1a730 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
1a740 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21 75 73 65   nReg<=n && !use
1a750 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
1a760 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
1a770 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1a780 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
1a790 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
1a7a0 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
1a7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a7c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1a7d0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
1a7e0 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
1a7f0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
1a800 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
1a810 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
1a820 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1a830 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
1a840 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
1a850 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
1a860 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
1a870 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
1a880 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1a890 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
1a8a0 7d 0a                                            }.