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

Artifact a385202af56d622b11d05e8d386def256155152b:


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 30 38 20 32 30 30 38 2f 31 32 2f 31 35 20  .408 2008/12/15 
0220: 31 35 3a 32 37 3a 35 32 20 64 72 68 20 45 78 70  15:27:52 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  if.  if( (op==TK
0590: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f  _AGG_COLUMN || o
05a0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
05b0: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 29  op==TK_REGISTER)
05c0: 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70   .   && pExpr->p
05d0: 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  Tab!=0.  ){.    
05e0: 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  /* op==TK_REGIST
05f0: 45 52 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ER && pExpr->pTa
0600: 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77 68 65  b!=0 happens whe
0610: 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72 69 67  n pExpr was orig
0620: 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 61 20  inally.    ** a 
0630: 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61  TK_COLUMN but wa
0640: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61  s previously eva
0650: 6c 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65  luated and cache
0660: 64 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20  d in a register 
0670: 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  */.    int j = p
0680: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
0690: 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74     if( j<0 ) ret
06a0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  urn SQLITE_AFF_I
06b0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 61 73 73 65  NTEGER;.    asse
06c0: 72 74 28 20 70 45 78 70 72 2d 3e 70 54 61 62 20  rt( pExpr->pTab 
06d0: 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70 54 61 62  && j<pExpr->pTab
06e0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 72 65  ->nCol );.    re
06f0: 74 75 72 6e 20 70 45 78 70 72 2d 3e 70 54 61 62  turn pExpr->pTab
0700: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
0710: 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
0720: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
0730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
0740: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0750: 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73  uence for expres
0760: 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65  sion pExpr to be
0770: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
0780: 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64  * sequence named
0790: 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65   by pToken.   Re
07a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
07b0: 6f 20 74 68 65 20 72 65 76 69 73 65 64 20 65 78  o the revised ex
07c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65  pression..** The
07d0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
07e0: 6e 63 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nce is marked as
07f0: 20 22 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e   "explicit" usin
0800: 67 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c  g the EP_ExpColl
0810: 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e  ate.** flag.  An
0820: 20 65 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74   explicit collat
0830: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
0840: 6c 20 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69  l override impli
0850: 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  cit.** collating
0860: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45   sequences..*/.E
0870: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0880: 53 65 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70  SetColl(Parse *p
0890: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
08a0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 6c  pr, Token *pColl
08b0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
08c0: 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Coll = 0;       
08d0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
08e0: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
08f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
0900: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
0910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0920: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
0930: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
0940: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
0950: 70 43 6f 6c 6c 4e 61 6d 65 29 3b 0a 20 20 69 66  pCollName);.  if
0960: 28 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c  ( pExpr && zColl
0970: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
0980: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
0990: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
09a0: 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28  ll, -1);.    if(
09b0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
09c0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
09d0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70  Coll;.      pExp
09e0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45  r->flags |= EP_E
09f0: 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  xpCollate;.    }
0a00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
0a10: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
0a20: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
0a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0a40: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
0a50: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
0a60: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
0a70: 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20  on pExpr. If.** 
0a80: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61  there is no defa
0a90: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79  ult collation ty
0aa0: 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  pe, return 0..*/
0ab0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
0ac0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72  3ExprCollSeq(Par
0ad0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
0ae0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c   *pExpr){.  Coll
0af0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
0b00: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 78 70    Expr *p = pExp
0b10: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  r;.  while( p ){
0b20: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20  .    int op;.   
0b30: 20 70 43 6f 6c 6c 20 3d 20 70 2d 3e 70 43 6f 6c   pColl = p->pCol
0b40: 6c 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  l;.    if( pColl
0b50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 70   ) break;.    op
0b60: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66   = p->op;.    if
0b70: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
0b80: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
0b90: 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  OLUMN || op==TK_
0ba0: 52 45 47 49 53 54 45 52 29 20 26 26 20 70 2d 3e  REGISTER) && p->
0bb0: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
0bc0: 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   /* op==TK_REGIS
0bd0: 54 45 52 20 26 26 20 70 2d 3e 70 54 61 62 21 3d  TER && p->pTab!=
0be0: 30 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 70  0 happens when p
0bf0: 45 78 70 72 20 77 61 73 20 6f 72 69 67 69 6e 61  Expr was origina
0c00: 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 54  lly.      ** a T
0c10: 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74 20 77 61 73  K_COLUMN but was
0c20: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 76 61 6c   previously eval
0c30: 75 61 74 65 64 20 61 6e 64 20 63 61 63 68 65 64  uated and cached
0c40: 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 20 2a   in a register *
0c50: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
0c60: 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ar *zColl;.     
0c70: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
0c80: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
0c90: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
0ca0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0cb0: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  rse->db;.       
0cc0: 20 7a 43 6f 6c 6c 20 3d 20 70 2d 3e 70 54 61 62   zColl = p->pTab
0cd0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
0ce0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
0cf0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
0d00: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
0d10: 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a   zColl, -1, 0);.
0d20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
0d30: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  Coll = pColl;.  
0d40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
0d50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
0d60: 20 6f 70 21 3d 54 4b 5f 43 41 53 54 20 26 26 20   op!=TK_CAST && 
0d70: 6f 70 21 3d 54 4b 5f 55 50 4c 55 53 20 29 7b 0a  op!=TK_UPLUS ){.
0d80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0d90: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c   }.    p = p->pL
0da0: 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  eft;.  }.  if( s
0db0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0dc0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0dd0: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0de0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0df0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0e00: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0e10: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0e20: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0e30: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0e40: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0e50: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0e60: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0e70: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0e80: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0e90: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0ea0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0eb0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0ec0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0ed0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0ee0: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0ef0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0f00: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0f10: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0f20: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0f30: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0f40: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0f50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0f60: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0f70: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0f80: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0f90: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0fa0: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0fb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0fc0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0fd0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
0fe0: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
0ff0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
1000: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1010: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
1020: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
1030: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1040: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1050: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1060: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
1070: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
1080: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
1090: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
10a0: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
10b0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
10c0: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
10d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10e0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
10f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
1100: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
1110: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
1120: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
1130: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
1140: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1150: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
1160: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
1170: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
1180: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
1190: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
11a0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
11b0: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
11c0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
11d0: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
11e0: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
11f0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
1200: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
1210: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1220: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
1230: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
1240: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
1250: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1260: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
1270: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
1280: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
1290: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
12a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
12b0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
12c0: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
12d0: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
12e0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
12f0: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
1300: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
1310: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
1320: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1330: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
1340: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
1350: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
1360: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1370: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
1380: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65  t, aff);.  }.  e
1390: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
13a0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66  Select ){.    af
13b0: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
13c0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
13d0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
13e0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
13f0: 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ff);.  }.  else 
1400: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
1410: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
1420: 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _NONE;.  }.  ret
1430: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
1440: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
1450: 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69  parison expressi
1460: 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27  on, eg. '=', '<'
1470: 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a  , IN(...) etc..*
1480: 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69  * idx_affinity i
1490: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
14a0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
14b0: 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65  umn. Return true
14c0: 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78  .** if the index
14d0: 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20 69   with affinity i
14e0: 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20  dx_affinity may 
14f0: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
1500: 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70  ment.** the comp
1510: 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e  arison in pExpr.
1520: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1530: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45  ndexAffinityOk(E
1540: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
1550: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a   idx_affinity){.
1560: 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d    char aff = com
1570: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
1580: 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68  pExpr);.  switch
1590: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73  ( aff ){.    cas
15a0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  e SQLITE_AFF_NON
15b0: 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  E:.      return 
15c0: 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  1;.    case SQLI
15d0: 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20  TE_AFF_TEXT:.   
15e0: 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66     return idx_af
15f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
1600: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66  FF_TEXT;.    def
1610: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
1620: 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  rn sqlite3IsNume
1630: 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f  ricAffinity(idx_
1640: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d  affinity);.  }.}
1650: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1660: 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61 74  he P5 value that
1670: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1680: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1690: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
16a0: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
16b0: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
16c0: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
16d0: 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74   pExpr2..*/.stat
16e0: 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70  ic u8 binaryComp
16f0: 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78 70  areP5(Expr *pExp
1700: 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32  r1, Expr *pExpr2
1710: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1720: 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63  ){.  u8 aff = (c
1730: 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72 41  har)sqlite3ExprA
1740: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
1750: 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71 6c  .  aff = (u8)sql
1760: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1770: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
1780: 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75 6c   | (u8)jumpIfNul
1790: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  l;.  return aff;
17a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
17d0: 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64  ence that should
17e0: 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61   be used by.** a
17f0: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1800: 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70  on operator comp
1810: 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20  aring pLeft and 
1820: 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  pRight..**.** If
1830: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65   the left hand e
1840: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1850: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1860: 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74  ce type, then it
1870: 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68   is.** used. Oth
1880: 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61  erwise the colla
1890: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
18a0: 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  r the right hand
18b0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
18c0: 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64  s used, or the d
18d0: 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20  efault (BINARY) 
18e0: 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65  if neither expre
18f0: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1900: 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a  ating.** type..*
1910: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52  *.** Argument pR
1920: 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c  ight (but not pL
1930: 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75  eft) may be a nu
1940: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74  ll pointer. In t
1950: 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20  his case,.** it 
1960: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1970: 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  d..*/.CollSeq *s
1980: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
1990: 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61  areCollSeq(.  Pa
19a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
19b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20  Expr *pLeft, .  
19c0: 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a  Expr *pRight.){.
19d0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
19e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
19f0: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1a00: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1a10: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1a20: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1a30: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1a40: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1a50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1a60: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66  ght && pRight->f
1a70: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1a80: 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65  late ){.    asse
1a90: 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  rt( pRight->pCol
1aa0: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
1ab0: 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a   pRight->pColl;.
1ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
1ad0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1ae0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1af0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
1b00: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
1b10: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1b20: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1b30: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
1b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1b50: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1b60: 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70 65 72  enerate the oper
1b70: 61 6e 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61  ands for a compa
1b80: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
1b90: 20 20 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65    Before.** gene
1ba0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
1bb0: 66 6f 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64  for each operand
1bc0: 2c 20 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79  , set the EP_Any
1bd0: 41 66 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74  Aff.** flag on t
1be0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1bf0: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1c00: 20 61 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a   able to used a.
1c10: 2a 2a 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e  ** cached column
1c20: 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20   value that has 
1c30: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72  previously under
1c40: 67 6f 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e  gone an.** affin
1c50: 69 74 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73  ity change..*/.s
1c60: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43  tatic void codeC
1c70: 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a  ompareOperands(.
1c80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1c90: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1ca0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1cb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1cc0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1cd0: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1ce0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  erand */.  int *
1cf0: 70 52 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20  pRegLeft,    /* 
1d00: 52 65 67 69 73 74 65 72 20 77 68 65 72 65 20 6c  Register where l
1d10: 65 66 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73  eft operand is s
1d20: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  tored */.  int *
1d30: 70 46 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20  pFreeLeft,   /* 
1d40: 46 72 65 65 20 74 68 69 73 20 72 65 67 69 73 74  Free this regist
1d50: 65 72 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a  er when done */.
1d60: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1d70: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1d80: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1d90: 74 20 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20  t *pRegRight,   
1da0: 2f 2a 20 52 65 67 69 73 74 65 72 20 77 68 65 72  /* Register wher
1db0: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1dc0: 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  is stored */.  i
1dd0: 6e 74 20 2a 70 46 72 65 65 52 69 67 68 74 20 20  nt *pFreeRight  
1de0: 20 2f 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72   /* Write temp r
1df0: 65 67 69 73 74 65 72 20 66 6f 72 20 72 69 67 68  egister for righ
1e00: 74 20 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20  t operand there 
1e10: 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  */.){.  while( p
1e20: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  Left->op==TK_UPL
1e30: 55 53 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65  US ) pLeft = pLe
1e40: 66 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65  ft->pLeft;.  pLe
1e50: 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ft->flags |= EP_
1e60: 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c  AnyAff;.  *pRegL
1e70: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1e80: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1e90: 2c 20 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65  , pLeft, pFreeLe
1ea0: 66 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  ft);.  while( pR
1eb0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  ight->op==TK_UPL
1ec0: 55 53 20 29 20 70 52 69 67 68 74 20 3d 20 70 52  US ) pRight = pR
1ed0: 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70  ight->pLeft;.  p
1ee0: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  Right->flags |= 
1ef0: 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52  EP_AnyAff;.  *pR
1f00: 65 67 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  egRight = sqlite
1f10: 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f20: 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46  arse, pRight, pF
1f30: 72 65 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a  reeRight);.}../*
1f40: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1f50: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
1f60: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1f70: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
1f80: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
1f90: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
1fa0: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
1fb0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
1fc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1fd0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
1fe0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
1ff0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
2000: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2010: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2020: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2030: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2040: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2050: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2060: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2070: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2080: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2090: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
20a0: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
20b0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
20c0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
20d0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
20e0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
20f0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
2100: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2110: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2120: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2130: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2140: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2150: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2160: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2170: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2180: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2190: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
21a0: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
21b0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
21c0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
21f0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
2200: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2210: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2220: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2230: 0a 20 20 69 66 28 20 28 70 35 20 26 20 53 51 4c  .  if( (p5 & SQL
2240: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 29 21 3d 53  ITE_AFF_MASK)!=S
2250: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
2260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2270: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
2280: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31  ange(pParse, in1
2290: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
22a0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
22b0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
22c0: 20 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20   in2, 1);.  }.  
22d0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
22e0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
22f0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a  XPR_DEPTH>0./*.*
2300: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67  * Check that arg
2310: 75 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73  ument nHeight is
2320: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2330: 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ual to the maxim
2340: 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  um.** expression
2350: 20 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20   depth allowed. 
2360: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65  If it is not, le
2370: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2380: 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73  sage in.** pPars
2390: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23a0: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
23b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23c0: 69 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20  int nHeight){.  
23d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23e0: 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67  OK;.  int mxHeig
23f0: 68 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ht = pParse->db-
2400: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
2410: 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
2420: 3b 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e  ;.  if( nHeight>
2430: 6d 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  mxHeight ){.    
2440: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2450: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2460: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
2470: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
2480: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
2490: 22 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20  ", mxHeight.    
24a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
24b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
24c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
24e0: 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20  hree functions, 
24f0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20  heightOfExpr(), 
2500: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2510: 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74  ().** and height
2520: 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20  OfSelect(), are 
2530: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
2540: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  e the maximum he
2550: 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65  ight.** of any e
2560: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72  xpression tree r
2570: 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65  eferenced by the
2580: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2590: 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  d as the.** firs
25a0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
25b0: 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75  * If this maximu
25c0: 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61  m height is grea
25d0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
25e0: 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74  rent value point
25f0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65  ed.** to by pnHe
2600: 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64  ight, the second
2610: 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e   parameter, then
2620: 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74   set *pnHeight t
2630: 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e  o that.** value.
2640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2650: 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70  heightOfExpr(Exp
2660: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  r *p, int *pnHei
2670: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
2680: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69  .    if( p->nHei
2690: 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b  ght>*pnHeight ){
26a0: 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
26b0: 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20   = p->nHeight;. 
26c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
26d0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
26e0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
26f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2700: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2710: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2720: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2730: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2740: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2750: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65  a[i].pExpr, pnHe
2760: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
2770: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2780: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65  eightOfSelect(Se
2790: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  lect *p, int *pn
27a0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
27b0: 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66   ){.    heightOf
27c0: 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
27d0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
27e0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
27f0: 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74  Having, pnHeight
2800: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2810: 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70  xpr(p->pLimit, p
2820: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2830: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f  ightOfExpr(p->pO
2840: 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29  ffset, pnHeight)
2850: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2860: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
2870: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2880: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2890: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  t(p->pGroupBy, p
28a0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
28b0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
28c0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65  ->pOrderBy, pnHe
28d0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
28e0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72  tOfSelect(p->pPr
28f0: 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ior, pnHeight);.
2900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2910: 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68   the Expr.nHeigh
2920: 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  t variable in th
2930: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
2940: 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67  ed as an .** arg
2950: 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73  ument. An expres
2960: 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69  sion with no chi
2970: 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73  ldren, Expr.pLis
2980: 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53  t or .** Expr.pS
2990: 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73  elect member has
29a0: 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20   a height of 1. 
29b0: 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73  Any other expres
29c0: 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65  sion.** has a he
29d0: 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68  ight equal to th
29e0: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
29f0: 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a   of any other .*
2a00: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70  * referenced Exp
2a10: 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a 73  r plus one..*/.s
2a20: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 53  tatic void exprS
2a30: 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a 70  etHeight(Expr *p
2a40: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
2a50: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
2a60: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  Expr(p->pLeft, &
2a70: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
2a80: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67  htOfExpr(p->pRig
2a90: 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ht, &nHeight);. 
2aa0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2ab0: 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48 65  t(p->pList, &nHe
2ac0: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
2ad0: 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c 65  fSelect(p->pSele
2ae0: 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ct, &nHeight);. 
2af0: 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48   p->nHeight = nH
2b00: 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a  eight + 1;.}../*
2b10: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2b20: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2b30: 65 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72  e using the expr
2b40: 53 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63  SetHeight() func
2b50: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20  tion. If.** the 
2b60: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
2b70: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
2b80: 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65  um allowed expre
2b90: 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20  ssion depth,.** 
2ba0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
2bb0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
2bc0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
2bd0: 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70 50  Height(Parse *pP
2be0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a  arse, Expr *p){.
2bf0: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
2c00: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p);.  sqlite3Exp
2c10: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
2c20: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
2c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2c40: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
2c50: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
2c60: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
2c70: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
2c80: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
2c90: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
2ca0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
2cb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2cc0: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
2cd0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
2ce0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
2cf0: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
2d00: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
2d10: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a  Height;.}.#else.
2d20: 20 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65    #define exprSe
2d30: 74 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69  tHeight(y).#endi
2d40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
2d50: 45 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a  EXPR_DEPTH>0 */.
2d60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2d70: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2d80: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
2d90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
2da0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
2db0: 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f  r this node is o
2dc0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2dd0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20  ite3_malloc().  
2de0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2df0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
2e00: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
2e10: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
2e20: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
2e30: 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  freed..*/.Expr *
2e40: 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73  sqlite3Expr(.  s
2e50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
2e60: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2e70: 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61   for sqlite3DbMa
2e80: 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20  llocZero() (may 
2e90: 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e  be null) */.  in
2ea0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2eb0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
2ec0: 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
2ed0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
2ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
2ef0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2f00: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20  r *pRight,      
2f10: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70       /* Right op
2f20: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
2f30: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20   Token *pToken  
2f40: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
2f50: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  oken */.){.  Exp
2f60: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
2f70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2f80: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
2f90: 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70  (Expr));.  if( p
2fa0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  New==0 ){.    /*
2fb0: 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   When malloc fai
2fc0: 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74  ls, delete pLeft
2fd0: 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70   and pRight. Exp
2fe0: 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20  ressions passed 
2ff0: 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  to .    ** this 
3000: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c  function must al
3010: 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65  ways be allocate
3020: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78  d with sqlite3Ex
3030: 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20  pr() for this . 
3040: 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20     ** reason. . 
3050: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
3060: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3070: 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
3080: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3090: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  , pRight);.    r
30a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
30b0: 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70  New->op = (u8)op
30c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
30d0: 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d  = pLeft;.  pNew-
30e0: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
30f0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d  ;.  pNew->iAgg =
3100: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61   -1;.  pNew->spa
3110: 6e 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20  n.z = (u8*)"";. 
3120: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
3130: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
3140: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
3150: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
3160: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3170: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
3180: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
3190: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
31a0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70    if( pRight->sp
31b0: 61 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65  an.dyn==0 && pLe
31c0: 66 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20  ft->span.dyn==0 
31d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31e0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
31f0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
3200: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
3210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3220: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
3230: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3240: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3250: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3260: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3270: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
3280: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
3290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32a0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
32b0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
32c0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
32d0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
32e0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
32f0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
3300: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
3310: 20 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69   }..  exprSetHei
3320: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
3330: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3340: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
3350: 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65  lite3Expr() exce
3360: 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73  pt that it takes
3370: 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a   an extra Parse*
3380: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
3390: 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73   notifies the as
33a0: 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74  sociated connect
33b0: 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61  ion object if ma
33c0: 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45  lloc fails..*/.E
33d0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
33e0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
33f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
3400: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3410: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3440: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3450: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3460: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3470: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3480: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3490: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
34a0: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
34b0: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
34c0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
34d0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
34e0: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
34f0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c  ->db, op, pLeft,
3500: 20 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29   pRight, pToken)
3510: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
3520: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3530: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3540: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3550: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3560: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
3570: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
3580: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
3590: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
35a0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
35b0: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
35c0: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
35d0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
35e0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
35f0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
3600: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
3610: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
3620: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3630: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3640: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
3650: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
3660: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
3670: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
3680: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
3690: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
36a0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
36b0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
36c0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
36d0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
36e0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
36f0: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
3700: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
3710: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
3720: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
3730: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
3740: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
3750: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
3760: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3770: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
3780: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
3790: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
37a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
37b0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
37c0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
37d0: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
37e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
37f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
3800: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
3810: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
3820: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
3830: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3840: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
3850: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
3860: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
3870: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
3880: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
3890: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
38a0: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
38b0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
38c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
38d0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
38e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
38f0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
3900: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
3910: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
3920: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
3930: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
3940: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
3950: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3960: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
3970: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
3980: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
3990: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
39a0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
39b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
39c0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
39d0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
39e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
39f0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
3a00: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
3a10: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
3a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
3a30: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
3a40: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
3a50: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
3a60: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
3a70: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
3a80: 65 6e 20 74 6f 6b 65 6e 73 2e 20 20 42 6f 74 68  en tokens.  Both
3a90: 20 74 6f 6b 65 6e 73 20 6d 75 73 74 20 62 65 20   tokens must be 
3aa0: 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 74  pointing.** at t
3ab0: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 2e 0a  he same string..
3ac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3ad0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
3ae0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
3af0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
3b00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
3b10: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
3b20: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
3b30: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
3b40: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
3b50: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
3b60: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
3b70: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
3b80: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
3b90: 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >z);.  }.}../*.*
3ba0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
3bb0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
3bc0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
3bd0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
3be0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
3bf0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3c00: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
3c10: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
3c20: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
3c30: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
3c40: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
3c50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3c60: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
3c70: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
3c80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3c90: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3ca0: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
3cb0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
3cc0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3cd0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
3ce0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
3cf0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
3d00: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
3d10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3d20: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
3d30: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
3d40: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
3d50: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
3d60: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
3d70: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3d80: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
3d90: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
3da0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
3db0: 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  etHeight(pParse,
3dc0: 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
3dd0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3de0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
3df0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
3e00: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
3e10: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
3e20: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
3e30: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
3e40: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
3e50: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
3e60: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
3e70: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3e80: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
3e90: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
3ea0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
3eb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3ec0: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
3ed0: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
3ee0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
3ef0: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
3f00: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
3f10: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
3f20: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
3f30: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
3f40: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
3f50: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
3f60: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
3f70: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f80: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
3f90: 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67  "$aaa" are assig
3fa0: 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ned the same num
3fb0: 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72  ber.** as the pr
3fc0: 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20  evious instance 
3fd0: 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64  of the same wild
3fe0: 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69  card.  Or if thi
3ff0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
4000: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
4010: 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20  e wildcard, the 
4020: 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76  next sequenial v
4030: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
4040: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
4050: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4060: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
4070: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
4080: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4090: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a   Token *pToken;.
40a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
40b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
40c0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
40d0: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
40e0: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
40f0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
4100: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
4110: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
4120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4130: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
4140: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
4150: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
4160: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4170: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4180: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4190: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
41a0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
41b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
41c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
41d0: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
41e0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
41f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
4200: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
4210: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
4220: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
4230: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4240: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4250: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
4260: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
4270: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
4280: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
4290: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
42a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
42b0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73   i==1 );.    tes
42c0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
42d0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
42e0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
42f0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  R]-1 );.    test
4300: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
4310: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4320: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4330: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  ] );.    if( i<1
4340: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4350: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4360: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4370: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4380: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4390: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
43a0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
43b0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
43c0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
43d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
43e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
43f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4400: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
4410: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
4420: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
4430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4440: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4450: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
4460: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
4470: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4480: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
4490: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
44a0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
44b0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
44c0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
44d0: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
44e0: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
44f0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
4500: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
4510: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4520: 75 33 32 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70  u32 n;.    n = p
4530: 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f  Token->n;.    fo
4540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
4550: 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b  >nVarExpr; i++){
4560: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
4570: 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20 3d  .      if( (pE =
4580: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4590: 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20  pr[i])!=0.      
45a0: 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e      && pE->token
45b0: 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20  .n==n.          
45c0: 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f  && memcmp(pE->to
45d0: 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ken.z, pToken->z
45e0: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
45f0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4600: 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pE->iTable;. 
4610: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4630: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
4640: 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20  VarExpr ){.     
4650: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4660: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
4670: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
4680: 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61  e->nVarExpr>=pPa
4690: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
46a0: 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  oc-1 ){.        
46b0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
46c0: 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d  Alloc += pParse-
46d0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b  >nVarExprAlloc +
46e0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61   10;.        pPa
46f0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d  rse->apVarExpr =
4700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4710: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
4720: 72 65 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ree(.           
4730: 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20     db,.         
4740: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
4750: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
4760: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
4770: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
4780: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
4790: 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20 20 20  Expr[0]).       
47a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
47b0: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
47c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
47d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
47e0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
47f0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
4800: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
4810: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
4820: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
4830: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
4840: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
4850: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
4860: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
4870: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4880: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
4890: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
48a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
48b0: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
48c0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
48d0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6e 20 65 78  *.** Clear an ex
48e0: 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75  pression structu
48f0: 72 65 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  re without delet
4900: 69 6e 67 20 74 68 65 20 73 74 72 75 63 74 75 72  ing the structur
4910: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 53 75 62  e itself..** Sub
4920: 73 74 72 75 63 74 75 72 65 20 69 73 20 64 65 6c  structure is del
4930: 65 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eted..*/.void sq
4940: 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28 73  lite3ExprClear(s
4950: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4960: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
4970: 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  pan.dyn ) sqlite
4980: 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68 61  3DbFree(db, (cha
4990: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
49a0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
49b0: 6e 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  n ) sqlite3DbFre
49c0: 65 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  e(db, (char*)p->
49d0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
49e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
49f0: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73  , p->pLeft);.  s
4a00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4a10: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
4a20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4a30: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
4a40: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
4a50: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4a60: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 7d  , p->pSelect);.}
4a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
4a80: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
4a90: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
4aa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4ab0: 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  prDelete(sqlite3
4ac0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4ad0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4ae0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  urn;.  sqlite3Ex
4af0: 70 72 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a  prClear(db, p);.
4b00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4b10: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
4b20: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
4b30: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
4b40: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
4b50: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
4b60: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
4b70: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
4b80: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
4b90: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
4ba0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4bb0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78  pr *p){.  if( Ex
4bc0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
4bd0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
4be0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
4bf0: 20 20 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f    }.  ExprSetPro
4c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75  perty(p, EP_Dequ
4c10: 6f 74 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  oted);.  if( p->
4c20: 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a  token.dyn==0 ){.
4c30: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
4c40: 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e 74 6f 6b  Copy(db, &p->tok
4c50: 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a  en, &p->token);.
4c60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
4c70: 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  uote((char*)p->t
4c80: 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  oken.z);.}../*.*
4c90: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4ca0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
4cb0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
4cc0: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
4cd0: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
4ce0: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
4cf0: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
4d00: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
4d10: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
4d20: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
4d30: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
4d40: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
4d50: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
4d60: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
4d70: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
4d80: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
4d90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
4da0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
4db0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
4dc0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4dd0: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
4de0: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
4df0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4e00: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
4e10: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
4e20: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
4e30: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
4e40: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
4e50: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
4e60: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
4e70: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
4e80: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
4e90: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
4ea0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4eb0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
4ec0: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4ed0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
4ee0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
4ef0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
4f00: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
4f10: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
4f20: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4f30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
4f40: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
4f50: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
4f60: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
4f70: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
4f80: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
4f90: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4fa0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  , (char*)p->toke
4fb0: 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z, p->token.n)
4fc0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
4fd0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
4fe0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4ff0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
5000: 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   );.  }.  pNew->
5010: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e  span.z = 0;.  pN
5020: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
5030: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5040: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77  ->pLeft);.  pNew
5050: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
5060: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
5070: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77  >pRight);.  pNew
5080: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
5090: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
50a0: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e   p->pList);.  pN
50b0: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
50c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
50d0: 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  b, p->pSelect);.
50e0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
50f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b  .void sqlite3Tok
5100: 65 6e 43 6f 70 79 28 73 71 6c 69 74 65 33 20 2a  enCopy(sqlite3 *
5110: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  db, Token *pTo, 
5120: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
5130: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
5140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5150: 2c 20 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29  , (char*)pTo->z)
5160: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
5170: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d   ){.    pTo->n =
5180: 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70   pFrom->n;.    p
5190: 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  To->z = (u8*)sql
51a0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
51b0: 2c 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e  , (char*)pFrom->
51c0: 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20  z, pFrom->n);.  
51d0: 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a    pTo->dyn = 1;.
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f    }else{.    pTo
51f0: 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45  ->z = 0;.  }.}.E
5200: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
5210: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
5220: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
5230: 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73  t *p){.  ExprLis
5240: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
5250: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
5260: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
5270: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
5280: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
5290: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
52a0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
52b0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  b, sizeof(*pNew)
52c0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
52d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
52e0: 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d  pNew->iECursor =
52f0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
5300: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
5310: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
5320: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
5330: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5340: 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70  Raw(db,  p->nExp
5350: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
5360: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
5370: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
5380: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
5390: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
53a0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
53b0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
53c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
53d0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
53e0: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
53f0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
5400: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
5410: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
5420: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
5430: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
5440: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
5450: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
5460: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
5470: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
5480: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
5490: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
54a0: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
54b0: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
54c0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
54d0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
54e0: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
54f0: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
5500: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
5510: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
5520: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
5530: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
5540: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
5550: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
5560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
5570: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65  kenCopy(db, &pNe
5580: 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f  wExpr->span, &pO
5590: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  ldExpr->span);. 
55a0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
55b0: 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20   pNewExpr==0 || 
55c0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pNewExpr->span.z
55d0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
55e0: 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70   || pOldExpr->sp
55f0: 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  an.z==0.        
5600: 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f      || db->mallo
5610: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
5620: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
5630: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5640: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
5650: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
5660: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
5670: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
5680: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
5690: 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  = 0;.    pItem->
56a0: 69 43 6f 6c 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  iCol = pOldItem-
56b0: 3e 69 43 6f 6c 3b 0a 20 20 20 20 70 49 74 65 6d  >iCol;.    pItem
56c0: 2d 3e 69 41 6c 69 61 73 20 3d 20 70 4f 6c 64 49  ->iAlias = pOldI
56d0: 74 65 6d 2d 3e 69 41 6c 69 61 73 3b 0a 20 20 7d  tem->iAlias;.  }
56e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
56f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
5700: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
5710: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
5720: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
5730: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
5740: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
5750: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5760: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
5770: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
5780: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
5790: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
57a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
57b0: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
57c0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
57d0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
57e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
57f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
5800: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
5810: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
5820: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
5830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5840: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
5850: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
5860: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
5870: 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63  cList *p){.  Src
5880: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
5890: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
58a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
58b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
58c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
58d0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
58e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
58f0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
5900: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
5910: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
5920: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
5930: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
5940: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
5950: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
5960: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
5970: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
5980: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
5990: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
59a0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
59b0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
59c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
59d0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
59e0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
59f0: 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49  *pTab;.    pNewI
5a00: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
5a10: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5a20: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5a30: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
5a40: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
5a50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5a60: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
5a70: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
5a80: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
5a90: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5aa0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
5ab0: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
5ac0: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
5ad0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
5ae0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
5af0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
5b00: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
5b10: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
5b20: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
5b30: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
5b40: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
5b50: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
5b60: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
5b70: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
5b80: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
5b90: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
5ba0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
5bb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
5bc0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
5bd0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
5be0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
5bf0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
5c00: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
5c10: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
5c20: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
5c30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
5c40: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
5c50: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
5c60: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
5c70: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
5c80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5c90: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
5ca0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
5cb0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
5cc0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
5cd0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  , pOldItem->pUsi
5ce0: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
5cf0: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
5d00: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
5d10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
5d20: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
5d30: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73 71  ite3IdListDup(sq
5d40: 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
5d50: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
5d60: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
5d70: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
5d80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
5d90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5da0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
5db0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
5dc0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
5dd0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20  ;.  pNew->nId = 
5de0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
5df0: 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61  ->nId;.  pNew->a
5e00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5e10: 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64  ocRaw(db, p->nId
5e20: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
5e30: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
5e40: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
5e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e  te3DbFree(db, pN
5e60: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
5e70: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
5e80: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
5e90: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
5ea0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
5eb0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
5ec0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
5ed0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
5ee0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
5ef0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
5f00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5f10: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
5f20: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
5f30: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
5f40: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
5f50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
5f60: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
5f70: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
5f80: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
5f90: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
5fa0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
5fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5fc0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
5fd0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
5fe0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
5ff0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
6000: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69   0;.  pNew->pELi
6010: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6020: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
6030: 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  EList);.  pNew->
6040: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
6050: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
6060: 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  pSrc);.  pNew->p
6070: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
6080: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
6090: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
60a0: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
60b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60c0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
60d0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
60e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
60f0: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
6100: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
6110: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
6120: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
6130: 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d  rderBy);.  pNew-
6140: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
6150: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
6160: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
6170: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
6180: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
6190: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
61a0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
61b0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
61c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
61d0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
61e0: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
61f0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66  = 0;.  pNew->iOf
6200: 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  fset = 0;.  pNew
6210: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  ->selFlags = p->
6220: 73 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55  selFlags & ~SF_U
6230: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
6240: 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
6250: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64   = 0;.  pNew->ad
6260: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
6270: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
6280: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
6290: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
62a0: 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
62b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
62c0: 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73  .#else.Select *s
62d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
62e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
62f0: 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ect *p){.  asser
6300: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
6310: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
6320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
6330: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
6340: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
6350: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
6360: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
6370: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
6380: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
6390: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
63a0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
63b0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
63c0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
63d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
63e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
63f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
6400: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
6410: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
6420: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
6430: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
6440: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
6450: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6460: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
6470: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6480: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me            /*
6490: 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20   AS keyword for 
64a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  the expression *
64b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
64c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
64d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
64e0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
64f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6500: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
6510: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
6520: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
6530: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
6540: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
6550: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
6560: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
6570: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
6580: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
6590: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
65a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
65b0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
65c0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
65d0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
65e0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
65f0: 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70  t->a, n*sizeof(p
6600: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
6610: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
6620: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
6630: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
6640: 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69  ->a = a;.    pLi
6650: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c  st->nAlloc = sql
6660: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
6670: 28 64 62 2c 20 61 29 2f 73 69 7a 65 6f 66 28 61  (db, a)/sizeof(a
6680: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [0]);.  }.  asse
6690: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
66a0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
66b0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
66c0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
66d0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
66e0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
66f0: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
6700: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
6710: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
6720: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
6730: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6740: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
6750: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
6760: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
6770: 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
6780: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6790: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
67a0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
67b0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
67c0: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
67d0: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
67e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
67f0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
6800: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6810: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
6820: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6830: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
6840: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
6850: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
6860: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
6870: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
6880: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
6890: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
68a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
68b0: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
68c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
68d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
68e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
68f0: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
6900: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
6910: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
6920: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
6930: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
6940: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
6950: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
6960: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
6970: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
6980: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
6990: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
69a0: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
69b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
69c0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
69d0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
69e0: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
69f0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
6a00: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
6a10: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
6a20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6a30: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
6a40: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
6a50: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
6a60: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
6a70: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
6a80: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
6a90: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
6aa0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
6ab0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30  (pList->nExpr==0
6ac0: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   && pList->nAllo
6ad0: 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  c==0) );.  asser
6ae0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  t( pList->nExpr<
6af0: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
6b00: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
6b10: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
6b20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
6b30: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6b40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6b50: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
6b60: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
6b70: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
6b80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
6b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6ba0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
6bb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6bc0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
6bd0: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
6be0: 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   are Walker call
6bf0: 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65 72 2e 75  backs.  Walker.u
6c00: 2e 70 69 20 69 73 20 61 20 70 6f 69 6e 74 65 72  .pi is a pointer
6c10: 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  .** to an intege
6c20: 72 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  r.  These routin
6c30: 65 73 20 61 72 65 20 63 68 65 63 6b 69 6e 67 20  es are checking 
6c40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
6c50: 20 73 65 65 0a 2a 2a 20 69 66 20 69 74 20 69 73   see.** if it is
6c60: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65   a constant.  Se
6c70: 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70 69 20 74  t *Walker.u.pi t
6c80: 6f 20 30 20 69 66 20 74 68 65 20 65 78 70 72 65  o 0 if the expre
6c90: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74 20  ssion is.** not 
6ca0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  constant..**.** 
6cb0: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
6cc0: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
6cd0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
6ce0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
6cf0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
6d00: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 0a 2a  prIsConstant().*
6d10: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
6d20: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
6d30: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  in().**     sqli
6d40: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6d50: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a  tOrFunction().**
6d60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
6d70: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
6d80: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
6d90: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
6da0: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
6db0: 72 2d 3e 75 2e 69 20 69 73 20 33 20 74 68 65 6e  r->u.i is 3 then
6dc0: 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65   any term of the
6dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
6de0: 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a   comes from.  **
6df0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
6e00: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
6e10: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
6e20: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
6e30: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
6e40: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
6e50: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
6e60: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20 26 26 20  lker->u.i==3 && 
6e70: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6e80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
6e90: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
6ea0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
6eb0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
6ec0: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
6ed0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
6ee0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
6ef0: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
6f00: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
6f10: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
6f20: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
6f30: 20 20 20 2a 2a 20 61 6e 64 20 70 57 61 6c 6b 65     ** and pWalke
6f40: 72 2d 3e 75 2e 69 3d 3d 32 20 2a 2f 0a 20 20 20  r->u.i==2 */.   
6f50: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
6f60: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
6f70: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 29 20 72  lker->u.i==2 ) r
6f80: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f  eturn 0;.      /
6f90: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
6fa0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
6fb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
6fc0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
6fd0: 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_DOT:.    case 
6fe0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
6ff0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
7000: 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66  _COLUMN:.#ifndef
7010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7020: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7030: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
7040: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
7050: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7060: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
7070: 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  CT );.      test
7080: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7090: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65  =TK_EXISTS );.#e
70a0: 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73 74 63  ndif.      testc
70b0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
70c0: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74  TK_ID );.      t
70d0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
70e0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
70f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7100: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44   pExpr->op==TK_D
7110: 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  OT );.      test
7120: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7130: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
7140: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7150: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
7160: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
7170: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
7180: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
7190: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
71a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
71b0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
71c0: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
71d0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
71e0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
71f0: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
7200: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
7210: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7220: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
7230: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30  pWalker->u.i = 0
7240: 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ;.  return WRC_A
7250: 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bort;.}.static i
7260: 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45  nt exprIsConst(E
7270: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74  xpr *p, int init
7280: 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Flag){.  Walker 
7290: 77 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  w;.  w.u.i = ini
72a0: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
72b0: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
72c0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
72d0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
72e0: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
72f0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
7300: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
7310: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
7320: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
7330: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
7340: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
7350: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7360: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
7370: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
7380: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
7390: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
73a0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
73b0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
73c0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
73d0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
73e0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
73f0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
7400: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
7410: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
7420: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
7430: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
7440: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
7450: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
7460: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
7470: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
7480: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
7490: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
74a0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
74b0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
74c0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
74d0: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
74e0: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
74f0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
7500: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
7510: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
7520: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
7530: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
7540: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
7550: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
7560: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
7570: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
7580: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
7590: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
75a0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
75b0: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
75c0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
75d0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
75e0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
75f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
7600: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
7610: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
7620: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
7630: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
7640: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
7650: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
7660: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
7670: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
7680: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
7690: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
76a0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
76b0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
76c0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
76d0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
76e0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
76f0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
7700: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
7710: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
7720: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
7730: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
7740: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
7750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
7760: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
7770: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
7780: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
7790: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
77a0: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
77b0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
77c0: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
77d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
77e0: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
77f0: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
7800: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
7810: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
7820: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
7830: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
7840: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
7850: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
7860: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
7870: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
7880: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
7890: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
78a0: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
78b0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
78c0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
78d0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
78e0: 56 61 6c 75 65 20 3d 20 70 2d 3e 69 54 61 62 6c  Value = p->iTabl
78f0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
7900: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
7910: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7920: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
7930: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7940: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
7950: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
7960: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
7970: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7980: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
7990: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
79a0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
79b0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
79c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
79d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
79e0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
79f0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
7a00: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7a10: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
7a20: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
7a30: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
7a40: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
7a50: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
7a70: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
7a80: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
7a90: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  p->op = TK_INTEG
7aa0: 45 52 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  ER;.    p->flags
7ab0: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
7ac0: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
7ad0: 20 2a 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 20 20   *pValue;.  }.  
7ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7af0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
7b00: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
7b10: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
7b20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
7b30: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
7b40: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
7b50: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
7b60: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
7b70: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
7b80: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7b90: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
7ba0: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
7bb0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7bc0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
7bd0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
7be0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
7bf0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7c00: 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74  TEST.  int sqlit
7c10: 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74  e3_enable_in_opt
7c20: 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 23 64   = 1;.#else.  #d
7c30: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e  efine sqlite3_en
7c40: 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a 23 65  able_in_opt 1.#e
7c50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
7c60: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 49  rn true if the I
7c70: 4e 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d  N operator optim
7c80: 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
7c90: 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 53 45  ed and.** the SE
7ca0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
7cb0: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6f   exists and is o
7cc0: 66 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 20  f the.** simple 
7cd0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
7ce0: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
7cf0: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
7d00: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
7d10: 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20 62  e case, it may b
7d20: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
7d30: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  e an existing ta
7d40: 62 6c 65 0a 2a 2a 20 6f 72 20 69 6e 64 65 78 20  ble.** or index 
7d50: 69 6e 73 74 65 61 64 20 6f 66 20 67 65 6e 65 72  instead of gener
7d60: 61 74 69 6e 67 20 61 6e 20 65 70 68 65 72 65 6d  ating an epherem
7d70: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  al table..*/.#if
7d80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7d90: 5f 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63  _SUBQUERY.static
7da0: 20 69 6e 74 20 69 73 43 61 6e 64 69 64 61 74 65   int isCandidate
7db0: 46 6f 72 49 6e 4f 70 74 28 53 65 6c 65 63 74 20  ForInOpt(Select 
7dc0: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
7dd0: 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74  pSrc;.  ExprList
7de0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
7df0: 65 20 2a 70 54 61 62 3b 0a 20 20 69 66 28 20 21  e *pTab;.  if( !
7e00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69  sqlite3_enable_i
7e10: 6e 5f 6f 70 74 20 29 20 72 65 74 75 72 6e 20 30  n_opt ) return 0
7e20: 3b 20 2f 2a 20 49 4e 20 6f 70 74 69 6d 69 7a 61  ; /* IN optimiza
7e30: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 6e 61  tion must be ena
7e40: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 3d  bled */.  if( p=
7e50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 2f 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73   /* right-hand s
7e80: 69 64 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c  ide of IN is SEL
7e90: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
7ea0: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
7eb0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7ec0: 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  /* Not a compoun
7ed0: 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66  d SELECT */.  if
7ee0: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
7ef0: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
7f00: 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
7f10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
7f20: 20 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79   No DISTINCT key
7f30: 77 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72  word and no aggr
7f40: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
7f50: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
7f60: 70 47 72 6f 75 70 42 79 20 29 20 72 65 74 75 72  pGroupBy ) retur
7f70: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
7f80: 2f 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20  /* Has no GROUP 
7f90: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
7fa0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  f( p->pLimit ) r
7fb0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
7fc0: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
7fd0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
7fe0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
7ff0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8000: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  f( p->pWhere ) r
8010: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
8020: 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
8030: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
8040: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
8050: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
8060: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
8070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
8080: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
8090: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
80a0: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
80b0: 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
80c0: 30 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  0;.  if( pSrc->a
80d0: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
80e0: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
80f0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
8100: 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  t a subquery */.
8110: 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61    pTab = pSrc->a
8120: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66 28 20  [0].pTab;.  if( 
8130: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
8140: 20 30 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   0;.  if( pTab->
8150: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
8160: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
8170: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
8180: 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
8190: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
81a0: 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
81b0: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
81c0: 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
81d0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
81e0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
81f0: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
8200: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
8210: 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  n 0;       /* On
8220: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
8230: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
8240: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
8250: 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  .pExpr->op!=TK_C
8260: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
8270: 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61  ; /* Result is a
8280: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74   column */.  ret
8290: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
82a0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
82b0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
82c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
82d0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 69  is used by the i
82e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
82f0: 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70   the IN (...) op
8300: 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20  erator..** It's 
8310: 6a 6f 62 20 69 73 20 74 6f 20 66 69 6e 64 20 6f  job is to find o
8320: 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65  r create a b-tre
8330: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
8340: 20 6d 61 79 20 62 65 20 75 73 65 64 0a 2a 2a 20   may be used.** 
8350: 65 69 74 68 65 72 20 74 6f 20 74 65 73 74 20 66  either to test f
8360: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 6f 66  or membership of
8370: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f   the (...) set o
8380: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
8390: 6f 75 67 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62  ough.** its memb
83a0: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 64 75  ers, skipping du
83b0: 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  plicates..**.** 
83c0: 54 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  The cursor opene
83d0: 64 20 6f 6e 20 74 68 65 20 73 74 72 75 63 74 75  d on the structu
83e0: 72 65 20 28 64 61 74 61 62 61 73 65 20 74 61 62  re (database tab
83f0: 6c 65 2c 20 64 61 74 61 62 61 73 65 20 69 6e 64  le, database ind
8400: 65 78 20 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d  ex .** or epherm
8410: 61 6c 20 74 61 62 6c 65 29 20 69 73 20 73 74 6f  al table) is sto
8420: 72 65 64 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c  red in pX->iTabl
8430: 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
8440: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
8450: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
8460: 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
8470: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 79  the structure ty
8480: 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  pe, as follows:.
8490: 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  **.**   IN_INDEX
84a0: 5f 52 4f 57 49 44 20 2d 20 54 68 65 20 63 75 72  _ROWID - The cur
84b0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
84c0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
84d0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
84e0: 58 5f 49 4e 44 45 58 20 2d 20 54 68 65 20 63 75  X_INDEX - The cu
84f0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
8500: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  on a database in
8510: 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  dex..**   IN_IND
8520: 45 58 5f 45 50 48 20 2d 20 20 20 54 68 65 20 63  EX_EPH -   The c
8530: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
8540: 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20   on a specially 
8550: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20  created and.**  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68 65    populated ephe
8580: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  remal table..**.
8590: 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73  ** An existing s
85a0: 74 72 75 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c  tructure may onl
85b0: 79 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  y be used if the
85c0: 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
85d0: 65 20 73 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d  e simple.** form
85e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
85f0: 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d  CT <column> FROM
8600: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49   <table>.**.** I
8610: 66 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61 72  f prNotFound par
8620: 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
8630: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
8640: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
8650: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
8660: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
8670: 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e 79  rs, skipping any
8680: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e 20   duplicates. In 
8690: 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a 20  this case an.** 
86a0: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20  epheremal table 
86b0: 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e 6c  must be used unl
86c0: 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65 64  ess the selected
86d0: 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75 61   <column> is gua
86e0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
86f0: 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65 72   unique - either
8700: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61   because it is a
8710: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
8720: 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20 69  Y KEY or it.** i
8730: 73 20 75 6e 69 71 75 65 20 62 79 20 76 69 72 74  s unique by virt
8740: 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  ue of a constrai
8750: 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74 20 69  nt or implicit i
8760: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
8770: 68 65 20 70 72 4e 6f 74 46 6f 75 6e 64 20 70 61  he prNotFound pa
8780: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
8790: 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63  , then the struc
87a0: 74 75 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65  ture will be use
87b0: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
87c0: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
87d0: 73 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sts. In this cas
87e0: 65 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74  e an epheremal t
87f0: 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65  able must .** be
8800: 20 75 73 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f   used unless <co
8810: 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45  lumn> is an INTE
8820: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8830: 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  or an index can 
8840: 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20 77 69 74  .** be found wit
8850: 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74  h <column> as it
8860: 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  s left-most colu
8870: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  mn..**.** When t
8880: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
8890: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 73  being used for s
88a0: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
88b0: 73 74 73 2c 20 74 68 65 20 75 73 65 72 0a 2a 2a  sts, the user.**
88c0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 77   needs to know w
88d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
88e0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
88f0: 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  ains an SQL NULL
8900: 20 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 6f 72   .** value in or
8910: 64 65 72 20 74 6f 20 63 6f 72 72 65 63 74 6c 79  der to correctly
8920: 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
8930: 73 69 6f 6e 73 20 6c 69 6b 65 20 22 58 20 49 4e  sions like "X IN
8940: 20 28 59 2c 20 5a 29 22 2e 0a 2a 2a 20 49 66 20   (Y, Z)"..** If 
8950: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
8960: 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75 63  e that the struc
8970: 74 75 72 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ture may contain
8980: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
8990: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
89a0: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
89b0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
89c0: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
89d0: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
89e0: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2e 20 49 66 20  *prNotFound. If 
89f0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
8a00: 63 65 20 74 68 61 74 20 74 68 65 20 73 74 72 75  ce that the stru
8a10: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8a20: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
8a30: 74 68 65 6e 20 2a 70 72 4e 6f 74 46 6f 75 6e 64  then *prNotFound
8a40: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
8a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
8a60: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
8a70: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
8a80: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
8a90: 2a 70 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 68 65  *prNotFound, the
8aa0: 6e 0a 2a 2a 20 69 74 73 20 69 6e 69 74 69 61 6c  n.** its initial
8ab0: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
8ac0: 49 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  If the structure
8ad0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 6d 61 69 6e   does not remain
8ae0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72   constant.** for
8af0: 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66   the duration of
8b00: 20 74 68 65 20 71 75 65 72 79 20 28 69 2e 65 2e   the query (i.e.
8b10: 20 74 68 65 20 73 65 74 20 69 73 20 61 20 63 6f   the set is a co
8b20: 72 72 65 6c 61 74 65 64 20 73 75 62 2d 73 65 6c  rrelated sub-sel
8b30: 65 63 74 29 2c 20 0a 2a 2a 20 74 68 65 20 76 61  ect), .** the va
8b40: 6c 75 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  lue of the alloc
8b50: 61 74 65 64 20 72 65 67 69 73 74 65 72 20 69 73  ated register is
8b60: 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 65   reset to NULL e
8b70: 61 63 68 20 74 69 6d 65 20 74 68 65 20 0a 2a 2a  ach time the .**
8b80: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
8b90: 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 69 73 20  populated. This 
8ba0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 65  allows the calle
8bb0: 72 20 74 6f 20 75 73 65 20 76 64 62 65 20 63 6f  r to use vdbe co
8bc0: 64 65 20 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e  de .** equivalen
8bd0: 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
8be0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  ng:.**.**   if( 
8bf0: 72 65 67 69 73 74 65 72 3d 3d 4e 55 4c 4c 20 29  register==NULL )
8c00: 7b 0a 2a 2a 20 20 20 20 20 68 61 73 5f 6e 75 6c  {.**     has_nul
8c10: 6c 20 3d 20 3c 74 65 73 74 20 69 66 20 64 61 74  l = <test if dat
8c20: 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
8c30: 61 69 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 20 20  ains null>.**   
8c40: 20 20 72 65 67 69 73 74 65 72 20 3d 20 31 0a 2a    register = 1.*
8c50: 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 69 6e 20 6f  *   }.**.** in o
8c60: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 72 75  rder to avoid ru
8c70: 6e 6e 69 6e 67 20 74 68 65 20 3c 74 65 73 74 20  nning the <test 
8c80: 69 66 20 64 61 74 61 20 73 74 72 75 63 74 75 72  if data structur
8c90: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c 6c 3e  e contains null>
8ca0: 0a 2a 2a 20 74 65 73 74 20 6d 6f 72 65 20 6f 66  .** test more of
8cb0: 74 65 6e 20 74 68 61 6e 20 69 73 20 6e 65 63 65  ten than is nece
8cc0: 73 73 61 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ssary..*/.#ifnde
8cd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
8ce0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
8cf0: 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 50 61  e3FindInIndex(Pa
8d00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8d10: 72 20 2a 70 58 2c 20 69 6e 74 20 2a 70 72 4e 6f  r *pX, int *prNo
8d20: 74 46 6f 75 6e 64 29 7b 0a 20 20 53 65 6c 65 63  tFound){.  Selec
8d30: 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65 54 79 70  t *p;.  int eTyp
8d40: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
8d50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
8d60: 2b 2b 3b 0a 20 20 69 6e 74 20 6d 75 73 74 42 65  ++;.  int mustBe
8d70: 55 6e 69 71 75 65 20 3d 20 21 70 72 4e 6f 74 46  Unique = !prNotF
8d80: 6f 75 6e 64 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ound;..  /* The 
8d90: 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e 29  follwing if(...)
8da0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
8db0: 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45 43  rue if the SELEC
8dc0: 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20 2a  T is of the .  *
8dd0: 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 20  * simple form:. 
8de0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
8df0: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
8e00: 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a 20  M <table>.  **. 
8e10: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
8e20: 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79 20  he case, it may 
8e30: 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  be possible to u
8e40: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  se an existing t
8e50: 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e 64  able.  ** or ind
8e60: 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67 65  ex instead of ge
8e70: 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68 65  nerating an ephe
8e80: 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  remal table..  *
8e90: 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65 6c  /.  p = pX->pSel
8ea0: 65 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61 6e  ect;.  if( isCan
8eb0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
8ec0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8ed0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8ee0: 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  b;.    Index *pI
8ef0: 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  dx;.    Expr *pE
8f00: 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
8f10: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
8f20: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
8f30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
8f40: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
8f50: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
8f60: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
8f70: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
8f80: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
8f90: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
8fa0: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
8fb0: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
8fc0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
8fd0: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
8fe0: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
8ff0: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
9000: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
9010: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
9020: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
9030: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
9040: 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
9050: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e  ->nMem;.      in
9060: 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20 54  t iAddr;.      T
9070: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e  able *pTab = p->
9080: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
9090: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
90a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
90b0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
90c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
90d0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
90e0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20  tree(v, iDb);.. 
90f0: 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71 6c       iAddr = sql
9100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
9110: 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a  , OP_If, iMem);.
9120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9130: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9140: 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b  teger, 1, iMem);
9150: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
9160: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
9170: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
9180: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
9190: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
91a0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
91b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
91c0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
91d0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
91e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
91f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
9200: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
9210: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
9220: 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20 20  ex is to .      
9230: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
9240: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
9250: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
9260: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
9270: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
9280: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
9290: 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  uence..      */.
92a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
92b0: 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  Req = sqlite3Bin
92c0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
92d0: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
92e0: 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  eft, pExpr);..  
92f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
9300: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
9310: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
9320: 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20   to perform the 
9330: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  .      ** compar
9340: 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  ison is the same
9350: 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74 79   as the affinity
9360: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
9370: 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  If.      ** it i
9380: 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74  s not, it is not
9390: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
93a0: 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20   any index..    
93b0: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
93c0: 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63   *pTab = p->pSrc
93d0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
93e0: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f     char aff = co
93f0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
9400: 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pX);.      int 
9410: 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70  affinity_ok = (p
9420: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9430: 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61  affinity==aff||a
9440: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9450: 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ONE);..      for
9460: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
9470: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
9480: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
9490: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
94a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
94b0: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
94c0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
94d0: 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71 3d         && (pReq=
94e0: 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c  =sqlite3FindColl
94f0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
9500: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
9510: 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20 20  , -1, 0)).      
9520: 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e     && (!mustBeUn
9530: 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  ique || (pIdx->n
9540: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
9550: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
9560: 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29 7b  one)).        ){
9570: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
9580: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  Db;.          in
9590: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
95a0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
95b0: 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20     int iAddr;.  
95c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4b          char *pK
95d0: 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  ey;.  .         
95e0: 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29   pKey = (char *)
95f0: 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
9600: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
9610: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  );.          iDb
9620: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
9630: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64 78  ToIndex(db, pIdx
9640: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
9650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9660: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
9670: 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  b);..          i
9680: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
9690: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
96a0: 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  f, iMem);.      
96b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
96c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
96d0: 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20  ger, 1, iMem);. 
96e0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
96f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9700: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
9710: 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  s, 0, pIdx->nCol
9720: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  umn);.          
9730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9740: 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  4(v, OP_OpenRead
9750: 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e  , iTab, pIdx->tn
9760: 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  um, iDb,.       
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34 5f          pKey,P4_
9790: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
97a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
97b0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
97c0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
97d0: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
97e0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
97f0: 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  X;..          sq
9800: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
9810: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
9820: 20 20 20 20 20 20 20 69 66 28 20 70 72 4e 6f 74         if( prNot
9830: 46 6f 75 6e 64 20 26 26 20 21 70 54 61 62 2d 3e  Found && !pTab->
9840: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75  aCol[iCol].notNu
9850: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
9860: 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d 20    *prNotFound = 
9870: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9880: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
98a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65    }.  }..  if( e
98b0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Type==0 ){.    i
98c0: 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  nt rMayHaveNull 
98d0: 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 0;.    eType =
98e0: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20   IN_INDEX_EPH;. 
98f0: 20 20 20 69 66 28 20 70 72 4e 6f 74 46 6f 75 6e     if( prNotFoun
9900: 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 4e 6f  d ){.      *prNo
9910: 74 46 6f 75 6e 64 20 3d 20 72 4d 61 79 48 61 76  tFound = rMayHav
9920: 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  eNull = ++pParse
9930: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73  ->nMem;.    }els
9940: 65 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d  e if( pX->pLeft-
9950: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 70 58  >iColumn<0 && pX
9960: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9970: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
9980: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
9990: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
99a0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
99b0: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
99c0: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
99d0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
99e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e   }else{.    pX->
99f0: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
9a00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70   }.  return eTyp
9a10: 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
9a20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9a30: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
9a40: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
9a50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
9a60: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
9a70: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
9a80: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
9a90: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
9aa0: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
9ab0: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
9ac0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
9ad0: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
9ae0: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
9af0: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
9b00: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
9b10: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
9b20: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9b30: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
9b40: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
9b50: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
9b60: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
9b70: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
9b80: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
9b90: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
9ba0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9bb0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
9bc0: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
9bd0: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a   or subquery..**
9be0: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
9bf0: 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d   isRowid is non-
9c00: 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65  zero, then expre
9c10: 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67  ssion pExpr is g
9c20: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20  uaranteed.** to 
9c30: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  be of the form "
9c40: 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f  <rowid> IN (?, ?
9c50: 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f  , ?)", where <ro
9c60: 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72 65  wid> is a refere
9c70: 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69  nce.** to some i
9c80: 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d  nteger key colum
9c90: 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54  n of a table B-T
9ca0: 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
9cb0: 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74  e, use an.** int
9cc0: 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74  key B-Tree to st
9cd0: 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 49  ore the set of I
9ce0: 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e  N(...) values in
9cf0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
9d00: 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76  al.** (slower) v
9d10: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
9d20: 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2f 0a 23  eys B-Tree..*/.#
9d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d40: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
9d50: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
9d60: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
9d70: 70 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20  pParse, .  Expr 
9d80: 2a 70 45 78 70 72 2c 20 0a 20 20 69 6e 74 20 72  *pExpr, .  int r
9d90: 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 0a 20 20 69  MayHaveNull,.  i
9da0: 6e 74 20 69 73 52 6f 77 69 64 0a 29 7b 0a 20 20  nt isRowid.){.  
9db0: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
9dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
9de0: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
9df0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
9e00: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9e10: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
9e20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20  =0 ) return;... 
9e30: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
9e40: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
9e50: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
9e60: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
9e70: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
9e80: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
9e90: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
9ea0: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
9eb0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9ec0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
9ed0: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
9ee0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
9ef0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
9f00: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
9f10: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
9f20: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
9f30: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
9f40: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
9f50: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
9f60: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
9f70: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
9f80: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
9f90: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
9fa0: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
9fb0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
9fc0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
9fd0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
9fe0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
9ff0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
a000: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
a010: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
a020: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
a030: 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50 61   int mem = ++pPa
a040: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
a050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a060: 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29 3b  (v, OP_If, mem);
a070: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
a080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a090: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a0a0: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61 73   1, mem);.    as
a0b0: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
a0c0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
a0d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a0e0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
a0f0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a100: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
a110: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
a120: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
a130: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
a140: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
a150: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
a160: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
a170: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
a180: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
a190: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
a1a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 72 4d 61 79  ..      if( rMay
a1b0: 48 61 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  HaveNull ){.    
a1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
a1e0: 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c  , 0, rMayHaveNul
a1f0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
a200: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
a210: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a220: 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  y(pLeft);..     
a230: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
a240: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
a250: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
a260: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
a270: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
a280: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
a290: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
a2a0: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
a2b0: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
a2c0: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
a2d0: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
a2e0: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
a2f0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
a300: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
a310: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
a320: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
a330: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
a340: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
a350: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
a360: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
a370: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
a380: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
a390: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
a3a0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
a3b0: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
a3c0: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
a3d0: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
a3e0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
a3f0: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
a400: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
a410: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
a420: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
a430: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
a440: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
a450: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
a460: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
a470: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
a480: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
a490: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
a4a0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
a4b0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
a4c0: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
a4d0: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
a4e0: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
a4f0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
a500: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
a510: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
a520: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
a530: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
a540: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78  enEphemeral, pEx
a550: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52  pr->iTable, !isR
a560: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 6d 65 6d  owid);.      mem
a570: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
a580: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
a590: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
a5a0: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 0a 20 20  .nField = 1;..  
a5b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
a5c0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
a5d0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
a5e0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
a5f0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
a600: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
a610: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
a620: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
a630: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
a640: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
a650: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
a660: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
a670: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
a680: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a690: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
a6a0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
a6b0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
a6c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
a6d0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
a6e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
a6f0: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
a700: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
a710: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
a720: 73 74 2e 61 66 66 69 6e 69 74 79 20 3d 20 28 75  st.affinity = (u
a730: 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
a740: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
a750: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
a760: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
a770: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
a780: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
a790: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
a7a0: 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  ->pSelect, &dest
a7b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
a7c0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
a7d0: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
a7e0: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
a7f0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
a800: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
a810: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
a820: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
a830: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
a840: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
a850: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
a860: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
a870: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
a880: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
a890: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
a8a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a8b0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
a8c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
a8d0: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
a8e0: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
a8f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a900: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
a910: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
a920: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
a930: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
a940: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
a950: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
a960: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
a970: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
a980: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
a990: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
a9a0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
a9b0: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
a9c0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
a9d0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
a9e0: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
a9f0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
aa00: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
aa10: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
aa20: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
aa30: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
aa40: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
aa50: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
aa60: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
aa70: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
aa80: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
aa90: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
aaa0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
aab0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
aac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aad0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
aae0: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
aaf0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
ab00: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
ab10: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
ab20: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
ab30: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
ab40: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
ab50: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
ab60: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ab70: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
ab80: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ab90: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
aba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
abb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
abc0: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
abd0: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
abe0: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
abf0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
ac00: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
ac10: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
ac20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
ac30: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
ac40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ac50: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
ac60: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
ac70: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
ac80: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
ac90: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
aca0: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
acb0: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
acc0: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
acd0: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
ace0: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
acf0: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
ad00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
ad10: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
ad20: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
ad30: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
ad40: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ad50: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
ad60: 64 72 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  dr && !sqlite3Ex
ad70: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
ad80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
ad90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ada0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
adb0: 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20  Addr-1, 2);.    
adc0: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
add0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ade0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
adf0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
ae00: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
ae10: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
ae20: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
ae30: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
ae40: 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
ae50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 33 20 3d  ;.          r3 =
ae60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ae70: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
ae80: 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  E2, r1);.       
ae90: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
aea0: 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
aeb0: 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  he>0 );.        
aec0: 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
aed0: 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 0a 20 20  eColCache--;..  
aee0: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
aef0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
af00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
af20: 65 49 6e 74 2c 20 72 33 2c 20 73 71 6c 69 74 65  eInt, r3, sqlite
af30: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
af40: 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
af50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
af70: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
af80: 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20  e, r2, r3);.    
af90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
afa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
afb0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
afc0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
afd0: 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
afe0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
aff0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
b000: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
b010: 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
b020: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
b030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b040: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
b050: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
b060: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r2);.          }
b070: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b080: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b090: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b0a0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
b0b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b0c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
b0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b0e0: 66 28 20 21 69 73 52 6f 77 69 64 20 29 7b 0a 20  f( !isRowid ){. 
b0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b100: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
b110: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
b120: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
b130: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
b150: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
b160: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
b170: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
b180: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
b190: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
b1a0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
b1b0: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
b1c0: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
b1d0: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
b1e0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
b1f0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
b200: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
b210: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
b220: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
b230: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
b240: 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d  onst Token one =
b250: 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20   { (u8*)"1", 0, 
b260: 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  1 };.      Selec
b270: 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53  t *pSel;.      S
b280: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
b290: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
b2a0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
b2b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b2c0: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
b2d0: 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d   0, ++pParse->nM
b2e0: 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  em);.      if( p
b2f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
b300: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ECT ){.        d
b310: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
b320: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
b330: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b340: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
b350: 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  st.iParm);.     
b360: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b370: 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
b380: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
b390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b3a0: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
b3b0: 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
b3c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b3e0: 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  er, 0, dest.iPar
b3f0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
b400: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
b410: 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
b420: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
b430: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
b440: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
b450: 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
b460: 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
b470: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
b480: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
b490: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
b4a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
b4b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b4c0: 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
b4d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b4f0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
b500: 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20   dest.iParm;.   
b510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b520: 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41    }..  if( testA
b530: 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ddr ){.    sqlit
b540: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b550: 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20  , testAddr-1);. 
b560: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   }..  return;.}.
b570: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b580: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
b590: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  /../*.** Duplica
b5a0: 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c  te an 8-byte val
b5b0: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
b5c0: 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62  r *dup8bytes(Vdb
b5d0: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
b5e0: 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f   *in){.  char *o
b5f0: 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ut = sqlite3DbMa
b600: 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56  llocRaw(sqlite3V
b610: 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20  dbeDb(v), 8);.  
b620: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d  if( out ){.    m
b630: 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38  emcpy(out, in, 8
b640: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b650: 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  out;.}../*.** Ge
b660: 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
b670: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
b680: 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
b690: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
b6a0: 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
b6b0: 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
b6c0: 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
b6d0: 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
b6e0: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
b6f0: 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
b700: 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
b710: 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
b720: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
b730: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
b740: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
b750: 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
b760: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
b770: 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
b780: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
b790: 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
b7a0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
b7b0: 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
b7c0: 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61  , int iMem){.  a
b7d0: 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30  ssert( z || v==0
b7e0: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44   || sqlite3VdbeD
b7f0: 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  b(v)->mallocFail
b800: 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
b810: 21 7a 20 7c 7c 20 21 69 73 64 69 67 69 74 28 7a  !z || !isdigit(z
b820: 5b 6e 5d 29 20 29 3b 0a 20 20 55 4e 55 53 45 44  [n]) );.  UNUSED
b830: 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 0a 20  _PARAMETER(n);. 
b840: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 64 6f   if( z ){.    do
b850: 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
b860: 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
b870: 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
b880: 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  lue);.    if( sq
b890: 6c 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65  lite3IsNaN(value
b8a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b8b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b8c0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Null, 0, iMem
b8d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b8e0: 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
b8f0: 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
b900: 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d 20  lue;.      zV = 
b910: 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
b920: 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
b930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b940: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
b950: 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
b960: 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 20 20 7d   P4_REAL);.    }
b970: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
b980: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
b990: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
b9a0: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
b9b0: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
b9c0: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
b9d0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
b9e0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
b9f0: 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
ba00: 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
ba10: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
ba20: 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
ba30: 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
ba40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
ba50: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
ba60: 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
ba70: 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
ba80: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
ba90: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
baa0: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
bab0: 62 65 20 2a 76 2c 20 45 78 70 72 20 2a 70 45 78  be *v, Expr *pEx
bac0: 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
bad0: 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 63 6f   int iMem){.  co
bae0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
baf0: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
bb00: 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
bb10: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
bb20: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
bb30: 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
bb40: 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb60: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
bb70: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  em);.  }else if(
bb80: 20 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78   (z = (char*)pEx
bb90: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 21 3d 30 20  pr->token.z)!=0 
bba0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
bbb0: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
bbc0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 61 73  >token.n;.    as
bbd0: 73 65 72 74 28 20 21 69 73 64 69 67 69 74 28 7a  sert( !isdigit(z
bbe0: 5b 6e 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [n]) );.    if( 
bbf0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
bc00: 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20  z, &i) ){.      
bc10: 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
bc20: 3d 20 2d 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -i;.      sqli
bc30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bc40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
bc50: 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iMem);.    }else
bc60: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
bc70: 49 6e 36 34 42 69 74 73 28 7a 2c 20 6e 65 67 46  In64Bits(z, negF
bc80: 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36  lag) ){.      i6
bc90: 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 63  4 value;.      c
bca0: 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 73  har *zV;.      s
bcb0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
bcc0: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  &value);.      i
bcd0: 66 28 20 6e 65 67 46 6c 61 67 20 29 20 76 61 6c  f( negFlag ) val
bce0: 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20  ue = -value;.   
bcf0: 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
bd00: 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
bd10: 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
bd20: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
bd30: 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
bd40: 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
bd50: 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
bd60: 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
bd70: 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46 6c 61 67 2c  , z, n, negFlag,
bd80: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20   iMem);.    }.  
bd90: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
bda0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
bdb0: 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
bdc0: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
bdd0: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
bde0: 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
bdf0: 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
be00: 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  in a register.  
be10: 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20  An effort.** is 
be20: 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  made to store th
be30: 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
be40: 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c  n register iReg,
be50: 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20   but this is.** 
be60: 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20  not guaranteed. 
be70: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
be80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
be90: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
bea0: 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
beb0: 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  be an open curso
bec0: 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
bed0: 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ble when this ro
bee0: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
bef0: 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c  ed.  If iColumn<
bf00: 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67  0 then code is g
bf10: 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78  enerated that ex
bf20: 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64  tracts the rowid
bf30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
bf40: 74 69 6e 65 20 6d 69 67 68 74 20 61 74 74 65 6d  tine might attem
bf50: 70 74 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  pt to reuse the 
bf60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6c  value of the col
bf70: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
bf80: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61  already been loa
bf90: 64 65 64 20 69 6e 74 6f 20 61 20 72 65 67 69 73  ded into a regis
bfa0: 74 65 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ter.  The value 
bfb0: 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 62  will always.** b
bfc0: 65 20 75 73 65 64 20 69 66 20 69 74 20 68 61 73  e used if it has
bfd0: 20 6e 6f 74 20 75 6e 64 65 72 67 6f 6e 65 20 61   not undergone a
bfe0: 6e 79 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ny affinity chan
bff0: 67 65 73 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ges.  But if.** 
c000: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
c010: 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  ge has occurred,
c020: 20 74 68 65 6e 20 74 68 65 20 63 61 63 68 65 64   then the cached
c030: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6f 6e 6c 79   value will only
c040: 20 62 65 0a 2a 2a 20 75 73 65 64 20 69 66 20 61   be.** used if a
c050: 6c 6c 6f 77 41 66 66 43 68 6e 67 20 69 73 20 74  llowAffChng is t
c060: 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rue..*/.int sqli
c070: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
c080: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
c090: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
c0a0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
c0b0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
c0c0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
c0d0: 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
c0e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
c0f0: 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  e we are reading
c100: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
c110: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49  Column,     /* I
c120: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
c130: 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  e column */.  in
c140: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f  t iTable,      /
c150: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
c160: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62  nting to the tab
c170: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
c180: 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ,        /* Stor
c190: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
c1a0: 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 41 66 66  /.  int allowAff
c1b0: 43 68 6e 67 20 2f 2a 20 54 72 75 65 20 69 66 20  Chng /* True if 
c1c0: 70 72 69 6f 72 20 61 66 66 69 6e 69 74 79 20 63  prior affinity c
c1d0: 68 61 6e 67 65 73 20 61 72 65 20 4f 4b 20 2a 2f  hanges are OK */
c1e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
c1f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
c200: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
c210: 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
c220: 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
c230: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
c240: 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  i<pParse->nColCa
c250: 63 68 65 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  che; i++, p++){.
c260: 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 6c      if( p->iTabl
c270: 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e  e==iTable && p->
c280: 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  iColumn==iColumn
c290: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
c2a0: 21 70 2d 3e 61 66 66 43 68 61 6e 67 65 20 7c 7c  !p->affChange ||
c2b0: 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 29 20 29   allowAffChng) )
c2c0: 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73 71  {.#if 0.      sq
c2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
c2e0: 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  v, OP_Noop);.   
c2f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c300: 76 2c 20 22 4f 50 54 3a 20 74 61 62 25 64 2e 63  v, "OPT: tab%d.c
c310: 6f 6c 25 64 20 2d 3e 20 72 25 64 22 2c 20 69 54  ol%d -> r%d", iT
c320: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70  able, iColumn, p
c330: 2d 3e 69 52 65 67 29 29 3b 0a 23 65 6e 64 69 66  ->iReg));.#endif
c340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
c350: 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
c360: 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
c370: 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 6c 75  0 );.  if( iColu
c380: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  mn<0 ){.    int 
c390: 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20 49 73  op = (pTab && Is
c3a0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 20 3f  Virtual(pTab)) ?
c3b0: 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f   OP_VRowid : OP_
c3c0: 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c 69 74  Rowid;.    sqlit
c3d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c3e0: 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67  op, iTable, iReg
c3f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
c400: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Tab==0 ){.    sq
c410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c420: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
c430: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69  able, iColumn, i
c440: 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Reg);.  }else{. 
c450: 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
c460: 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
c470: 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
c480: 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
c490: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
c4a0: 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  p, iTable, iColu
c4b0: 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73  mn, iReg);.    s
c4c0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
c4d0: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
c4e0: 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53  lumn);.#ifndef S
c4f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
c500: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66  ING_POINT.    if
c510: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ( pTab->aCol[iCo
c520: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
c530: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c540: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c550: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c560: 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 69  _RealAffinity, i
c570: 52 65 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Reg);.    }.#end
c580: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  if.  }.  if( pPa
c590: 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
c5a0: 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ache==0 ){.    i
c5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43   = pParse->iColC
c5c0: 61 63 68 65 3b 0a 20 20 20 20 70 20 3d 20 26 70  ache;.    p = &p
c5d0: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
c5e0: 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  [i];.    p->iTab
c5f0: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
c600: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
c610: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 2d 3e 69 52  olumn;.    p->iR
c620: 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70  eg = iReg;.    p
c630: 2d 3e 61 66 66 43 68 61 6e 67 65 20 3d 20 30 3b  ->affChange = 0;
c640: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66  .    i++;.    if
c650: 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ( i>=ArraySize(p
c660: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
c670: 29 20 29 20 69 20 3d 20 30 3b 0a 20 20 20 20 69  ) ) i = 0;.    i
c680: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 43 6f  f( i>pParse->nCo
c690: 6c 43 61 63 68 65 20 29 20 70 50 61 72 73 65 2d  lCache ) pParse-
c6a0: 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a  >nColCache = i;.
c6b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c      pParse->iCol
c6c0: 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 7d 0a 20  Cache = i;.  }. 
c6d0: 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
c6e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
c6f0: 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
c700: 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
c710: 20 77 69 74 68 20 74 68 65 20 76 64 62 65 0a 2a   with the vdbe.*
c720: 2a 20 63 75 72 73 6f 72 20 77 69 74 68 20 63 75  * cursor with cu
c730: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 54 61 62  rsor number iTab
c740: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
c750: 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75  te3ExprClearColu
c760: 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
c770: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
c780: 65 29 7b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  e){.  if( iTable
c790: 3c 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  <0 ){.    pParse
c7a0: 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b  ->nColCache = 0;
c7b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f  .    pParse->iCo
c7c0: 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 7d 65  lCache = 0;.  }e
c7d0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
c7e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c7f0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
c800: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c810: 28 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  ( pParse->aColCa
c820: 63 68 65 5b 69 5d 2e 69 54 61 62 6c 65 3d 3d 69  che[i].iTable==i
c830: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
c840: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 70 50   testcase( i==pP
c850: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d  arse->nColCache-
c860: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  1 );.        pPa
c870: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
c880: 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  ] = pParse->aCol
c890: 43 61 63 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e  Cache[--pParse->
c8a0: 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20  nColCache];.    
c8b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c      pParse->iCol
c8c0: 43 61 63 68 65 20 3d 20 70 50 61 72 73 65 2d 3e  Cache = pParse->
c8d0: 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 20  nColCache;.     
c8e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
c8f0: 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
c900: 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
c910: 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
c920: 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
c930: 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
c940: 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
c950: 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
c960: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
c970: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
c980: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
c990: 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
c9a0: 6f 75 6e 74 29 7b 0a 20 20 69 6e 74 20 69 45 6e  ount){.  int iEn
c9b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 43 6f  d = iStart + iCo
c9c0: 75 6e 74 20 2d 20 31 3b 0a 20 20 69 6e 74 20 69  unt - 1;.  int i
c9d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c9e0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
c9f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
ca00: 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  r = pParse->aCol
ca10: 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
ca20: 20 20 20 69 66 28 20 72 3e 3d 69 53 74 61 72 74     if( r>=iStart
ca30: 20 26 26 20 72 3c 3d 69 45 6e 64 20 29 7b 0a 20   && r<=iEnd ){. 
ca40: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f       pParse->aCo
ca50: 6c 43 61 63 68 65 5b 69 5d 2e 61 66 66 43 68 61  lCache[i].affCha
ca60: 6e 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nge = 1;.    }. 
ca70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
ca80: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
ca90: 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
caa0: 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
cab0: 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
cac0: 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
cad0: 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
cae0: 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
caf0: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
cb00: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
cb10: 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
cb20: 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
cb30: 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
cb40: 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
cb50: 20 69 66 28 20 69 46 72 6f 6d 3d 3d 69 54 6f 20   if( iFrom==iTo 
cb60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
cb70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 50  te3VdbeAddOp3(pP
cb80: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
cb90: 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f  Move, iFrom, iTo
cba0: 2c 20 6e 52 65 67 29 3b 0a 20 20 66 6f 72 28 69  , nReg);.  for(i
cbb0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
cbc0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
cbd0: 20 20 20 69 6e 74 20 78 20 3d 20 70 50 61 72 73     int x = pPars
cbe0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
cbf0: 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78 3e  iReg;.    if( x>
cc00: 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72 6f  =iFrom && x<iFro
cc10: 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20 20  m+nReg ){.      
cc20: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
cc30: 65 5b 69 5d 2e 69 52 65 67 20 2b 3d 20 69 54 6f  e[i].iReg += iTo
cc40: 2d 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20  -iFrom;.    }.  
cc50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
cc60: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 6f 70 79  ate code to copy
cc70: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65   content from re
cc80: 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e  gisters iFrom...
cc90: 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20  iFrom+nReg-1.** 
cca0: 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f  over to iTo..iTo
ccb0: 2b 6e 52 65 67 2d 31 2e 0a 2a 2f 0a 76 6f 69 64  +nReg-1..*/.void
ccc0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ccd0: 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
cce0: 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
ccf0: 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
cd00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
cd10: 28 20 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72  ( iFrom==iTo ) r
cd20: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
cd30: 3b 20 69 3c 6e 52 65 67 3b 20 69 2b 2b 29 7b 0a  ; i<nReg; i++){.
cd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cd50: 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
cd60: 64 62 65 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 46  dbe, OP_Copy, iF
cd70: 72 6f 6d 2b 69 2c 20 69 54 6f 2b 69 29 3b 0a 20  rom+i, iTo+i);. 
cd80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
cd90: 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72  rn true if any r
cda0: 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
cdb0: 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20  ange iFrom..iTo 
cdc0: 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69  (inclusive).** i
cdd0: 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
cde0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  f the column cac
cdf0: 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  he..*/.static in
ce00: 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  t usedAsColumnCa
ce10: 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
ce20: 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  e, int iFrom, in
ce30: 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  t iTo){.  int i;
ce40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
ce50: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
ce60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   i++){.    int r
ce70: 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   = pParse->aColC
ce80: 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20  ache[i].iReg;.  
ce90: 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
cea0: 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
ceb0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
cec0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
ced0: 65 72 65 73 20 69 73 20 61 20 76 61 6c 75 65 20  eres is a value 
cee0: 69 6e 20 72 65 67 69 73 74 65 72 20 69 43 75 72  in register iCur
cef0: 72 65 6e 74 2e 20 20 57 65 20 75 6c 74 69 6d 61  rent.  We ultima
cf00: 74 65 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 68 65  tely want.** the
cf10: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 69 6e 20   value to be in 
cf20: 72 65 67 69 73 74 65 72 20 69 54 61 72 67 65 74  register iTarget
cf30: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  .  It might be t
cf40: 68 61 74 0a 2a 2a 20 69 43 75 72 72 65 6e 74 20  hat.** iCurrent 
cf50: 61 6e 64 20 69 54 61 72 67 65 74 20 61 72 65 20  and iTarget are 
cf60: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
cf70: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72 65 20  r..**.** We are 
cf80: 67 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20  going to modify 
cf90: 74 68 65 20 76 61 6c 75 65 2c 20 73 6f 20 77 65  the value, so we
cfa0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
cfb0: 72 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  re it.** is not 
cfc0: 61 20 63 61 63 68 65 64 20 72 65 67 69 73 74 65  a cached registe
cfd0: 72 2e 20 20 49 66 20 69 43 75 72 72 65 6e 74 20  r.  If iCurrent 
cfe0: 69 73 20 61 20 63 61 63 68 65 64 20 72 65 67 69  is a cached regi
cff0: 73 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 72  ster,.** then tr
d000: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61  y to move the va
d010: 6c 75 65 20 6f 76 65 72 20 74 6f 20 69 54 61 72  lue over to iTar
d020: 67 65 74 2e 20 20 49 66 20 69 54 61 72 67 65 74  get.  If iTarget
d030: 20 69 73 20 61 0a 2a 2a 20 63 61 63 68 65 64 20   is a.** cached 
d040: 72 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20 63  register, then c
d050: 6c 65 61 72 20 74 68 65 20 63 6f 72 72 65 73 70  lear the corresp
d060: 6f 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e  onding cache lin
d070: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
d080: 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  the register tha
d090: 74 20 74 68 65 20 76 61 6c 75 65 20 65 6e 64 73  t the value ends
d0a0: 20 75 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73   up in..*/.int s
d0b0: 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61 62  qlite3ExprWritab
d0c0: 6c 65 52 65 67 69 73 74 65 72 28 50 61 72 73 65  leRegister(Parse
d0d0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 43   *pParse, int iC
d0e0: 75 72 72 65 6e 74 2c 20 69 6e 74 20 69 54 61 72  urrent, int iTar
d0f0: 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  get){.  int i;. 
d100: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d110: 3e 70 56 64 62 65 21 3d 30 20 29 3b 0a 20 20 69  >pVdbe!=0 );.  i
d120: 66 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e  f( !usedAsColumn
d130: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 43  Cache(pParse, iC
d140: 75 72 72 65 6e 74 2c 20 69 43 75 72 72 65 6e 74  urrent, iCurrent
d150: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d160: 69 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  iCurrent;.  }.  
d170: 69 66 28 20 69 43 75 72 72 65 6e 74 21 3d 69 54  if( iCurrent!=iT
d180: 61 72 67 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  arget ){.    sql
d190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
d1a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
d1b0: 5f 53 43 6f 70 79 2c 20 69 43 75 72 72 65 6e 74  _SCopy, iCurrent
d1c0: 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a  , iTarget);.  }.
d1d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
d1e0: 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
d1f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
d200: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
d210: 69 5d 2e 69 52 65 67 3d 3d 69 54 61 72 67 65 74  i].iReg==iTarget
d220: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
d230: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d  ->aColCache[i] =
d240: 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
d250: 68 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f  he[--pParse->nCo
d260: 6c 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 70  lCache];.      p
d270: 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65  Parse->iColCache
d280: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   = pParse->nColC
d290: 61 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ache;.    }.  }.
d2a0: 20 20 72 65 74 75 72 6e 20 69 54 61 72 67 65 74    return iTarget
d2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
d2c0: 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69  e last instructi
d2d0: 6f 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20 65  on coded is an e
d2e0: 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66  phemeral copy of
d2f0: 20 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72   any of.** the r
d300: 65 67 69 73 74 65 72 73 20 69 6e 20 74 68 65 20  egisters in the 
d310: 6e 52 65 67 20 72 65 67 69 73 74 65 72 73 20 62  nReg registers b
d320: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 52  eginning with iR
d330: 65 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76  eg, then.** conv
d340: 65 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73  ert the last ins
d350: 74 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50  truction from OP
d360: 5f 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70  _SCopy to OP_Cop
d370: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d380: 65 33 45 78 70 72 48 61 72 64 43 6f 70 79 28 50  e3ExprHardCopy(P
d390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
d3a0: 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
d3b0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
d3c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
d3d0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 76 20 3d 20  Vdbe *v;..  v = 
d3e0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
d3f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d400: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d410: 29 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  );.  pOp = sqlit
d420: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
d430: 64 64 72 2d 31 29 3b 0a 20 20 61 73 73 65 72 74  ddr-1);.  assert
d440: 28 20 70 4f 70 20 7c 7c 20 70 50 61 72 73 65 2d  ( pOp || pParse-
d450: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
d460: 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 20 26  d );.  if( pOp &
d470: 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
d480: 50 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e  P_SCopy && pOp->
d490: 70 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70 2d  p1>=iReg && pOp-
d4a0: 3e 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b  >p1<iReg+nReg ){
d4b0: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
d4c0: 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a   = OP_Copy;.  }.
d4d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d4e0: 65 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  e code to store 
d4f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
d500: 20 69 41 6c 69 61 73 2d 74 68 20 61 6c 69 61 73   iAlias-th alias
d510: 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20   in register.** 
d520: 74 61 72 67 65 74 2e 20 20 54 68 65 20 66 69 72  target.  The fir
d530: 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20  st time this is 
d540: 63 61 6c 6c 65 64 2c 20 70 45 78 70 72 20 69 73  called, pExpr is
d550: 20 65 76 61 6c 75 61 74 65 64 20 74 6f 20 63 6f   evaluated to co
d560: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 76 61 6c  mpute.** the val
d570: 75 65 20 6f 66 20 74 68 65 20 61 6c 69 61 73 2e  ue of the alias.
d580: 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73    The value is s
d590: 74 6f 72 65 64 20 69 6e 20 61 6e 20 61 75 78 69  tored in an auxi
d5a0: 6c 69 61 72 79 20 72 65 67 69 73 74 65 72 0a 2a  liary register.*
d5b0: 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  * and the number
d5c0: 20 6f 66 20 74 68 61 74 20 72 65 67 69 73 74 65   of that registe
d5d0: 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  r is returned.  
d5e0: 4f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  On subsequent ca
d5f0: 6c 6c 73 2c 0a 2a 2a 20 74 68 65 20 72 65 67 69  lls,.** the regi
d600: 73 74 65 72 20 6e 75 6d 62 65 72 20 69 73 20 72  ster number is r
d610: 65 74 75 72 6e 65 64 20 77 69 74 68 6f 75 74 20  eturned without 
d620: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 79 20 63  generating any c
d630: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ode..**.** Note 
d640: 74 68 61 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  that in order fo
d650: 72 20 74 68 69 73 20 74 6f 20 77 6f 72 6b 2c 20  r this to work, 
d660: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 67 65 6e  code must be gen
d670: 65 72 61 74 65 64 20 69 6e 20 74 68 65 0a 2a 2a  erated in the.**
d680: 20 73 61 6d 65 20 6f 72 64 65 72 20 74 68 61 74   same order that
d690: 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e   it is executed.
d6a0: 0a 2a 2a 0a 2a 2a 20 41 6c 69 61 73 65 73 20 61  .**.** Aliases a
d6b0: 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
d6c0: 74 69 6e 67 20 77 69 74 68 20 31 2e 20 20 53 6f  ting with 1.  So
d6d0: 20 69 41 6c 69 61 73 20 69 73 20 69 6e 20 74 68   iAlias is in th
d6e0: 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20 31 20  e range.** of 1 
d6f0: 74 6f 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  to pParse->nAlia
d700: 73 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 0a 2a  s inclusive.  .*
d710: 2a 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 61 41 6c  *.** pParse->aAl
d720: 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 20 72 65  ias[iAlias-1] re
d730: 63 6f 72 64 73 20 74 68 65 20 72 65 67 69 73 74  cords the regist
d740: 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
d750: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
d760: 74 68 65 20 69 41 6c 69 61 73 2d 74 68 20 61 6c  the iAlias-th al
d770: 69 61 73 20 69 73 20 73 74 6f 72 65 64 2e 20 20  ias is stored.  
d780: 49 66 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  If zero, that me
d790: 61 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ans that the.** 
d7a0: 61 6c 69 61 73 20 68 61 73 20 6e 6f 74 20 79 65  alias has not ye
d7b0: 74 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 2e  t been computed.
d7c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
d7d0: 6f 64 65 41 6c 69 61 73 28 50 61 72 73 65 20 2a  odeAlias(Parse *
d7e0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 41 6c 69  pParse, int iAli
d7f0: 61 73 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  as, Expr *pExpr,
d800: 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
d810: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d820: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
d830: 69 52 65 67 3b 0a 20 20 69 66 28 20 70 50 61 72  iReg;.  if( pPar
d840: 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3c  se->nAliasAlloc<
d850: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29  pParse->nAlias )
d860: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  {.    pParse->aA
d870: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
d880: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
d890: 2c 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73  , pParse->aAlias
d8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65     sizeof(pParse
d8d0: 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 2a 70 50 61  ->aAlias[0])*pPa
d8e0: 72 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20  rse->nAlias );. 
d8f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
d900: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
d910: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41   pParse->nAliasA
d920: 6c 6c 6f 63 3e 30 20 29 3b 0a 20 20 20 20 69 66  lloc>0 );.    if
d930: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d940: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
d950: 20 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73     memset(&pPars
d960: 65 2d 3e 61 41 6c 69 61 73 5b 70 50 61 72 73 65  e->aAlias[pParse
d970: 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 5d 2c 20  ->nAliasAlloc], 
d980: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  0,.           (p
d990: 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 2d 70 50  Parse->nAlias-pP
d9a0: 61 72 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f  arse->nAliasAllo
d9b0: 63 29 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  c)*sizeof(pParse
d9c0: 2d 3e 61 41 6c 69 61 73 5b 30 5d 29 29 3b 0a 20  ->aAlias[0]));. 
d9d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61     pParse->nAlia
d9e0: 73 41 6c 6c 6f 63 20 3d 20 70 50 61 72 73 65 2d  sAlloc = pParse-
d9f0: 3e 6e 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 61  >nAlias;.  }.  a
da00: 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30 20  ssert( iAlias>0 
da10: 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72 73  && iAlias<=pPars
da20: 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20 69  e->nAlias );.  i
da30: 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Reg = pParse->aA
da40: 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b 0a  lias[iAlias-1];.
da50: 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29 7b    if( iReg==0 ){
da60: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
da70: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
da80: 20 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d   ){.      iReg =
da90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
daa0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
dab0: 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
dac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dad0: 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iReg = ++pParse-
dae0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
daf0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
db00: 72 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65 67  rse, pExpr, iReg
db10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
db20: 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31  >aAlias[iAlias-1
db30: 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d 0a  ] = iReg;.    }.
db40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
db50: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
db60: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
db70: 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
db80: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
db90: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
dba0: 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
dbb0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
dbc0: 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
dbd0: 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
dbe0: 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
dbf0: 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
dc00: 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
dc10: 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
dc20: 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
dc30: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
dc40: 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
dc50: 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
dc60: 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
dc70: 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
dc80: 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
dc90: 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
dca0: 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
dcb0: 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
dcc0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
dcd0: 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
dce0: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
dcf0: 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
dd00: 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
dd10: 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
dd20: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
dd30: 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
dd40: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
dd50: 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
dd60: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
dd70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
dd80: 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
dd90: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
dda0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
ddb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ddc0: 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
ddd0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
dde0: 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
ddf0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
de00: 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
de10: 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
de20: 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
de30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
de40: 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
de50: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
de60: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
de70: 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
de80: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
de90: 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
dea0: 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
deb0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
dec0: 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
ded0: 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
dee0: 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
def0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 64 62 20  ite3 *db;..  db 
df00: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
df10: 61 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c 20  assert( v!=0 || 
df20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
df30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61   );.  assert( ta
df40: 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
df50: 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
df60: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
df70: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20  eturn 0;..  if( 
df80: 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
df90: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
dfa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
dfb0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
dfc0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
dfd0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
dfe0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
dff0: 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
e000: 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
e010: 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
e020: 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
e030: 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
e040: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
e050: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
e060: 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
e070: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
e080: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
e090: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
e0a0: 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Reg = pCol->iMem
e0b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
e0c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e0d0: 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
e0e0: 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
e0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e100: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
e110: 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
e120: 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
e150: 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
e160: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
e170: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e180: 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
e190: 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
e1a0: 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
e1b0: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
e1c0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
e1d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
e1e0: 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  r->iTable<0 ){. 
e1f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f         /* This o
e200: 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
e210: 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f   coding check co
e220: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
e230: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
e240: 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b  rse->ckBase>0 );
e250: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
e260: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
e270: 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  + pParse->ckBase
e280: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e290: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
e2a0: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
e2b0: 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20 29   EP_AnyAff)!=0 )
e2c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
e2d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
e2e0: 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
e2f0: 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a  e, pExpr->pTab,.
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
e330: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
e340: 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
e370: 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41 66  flags & EP_AnyAf
e380: 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
e390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e3a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
e3b0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
e3c0: 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70 72  Integer(v, pExpr
e3d0: 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
e3e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e3f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
e400: 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  AT: {.      code
e410: 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
e420: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e430: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
e440: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
e450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e460: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
e470: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e480: 33 44 65 71 75 6f 74 65 45 78 70 72 28 64 62 2c  3DequoteExpr(db,
e490: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
e4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
e4b0: 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  (v,OP_String8, 0
e4c0: 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20 20 20  , target, 0,.   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70       (char*)pExp
e4f0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
e500: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
e510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e520: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
e530: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e540: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e550: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
e560: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
e570: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
e590: 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
e5a0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
e5b0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
e5c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
e5d0: 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
e5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e5f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33  Expr->token.n>=3
e600: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e610: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
e620: 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
e630: 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
e640: 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
e650: 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
e660: 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  .z[1]=='\'' );. 
e670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e680: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70  pr->token.z[pExp
e690: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27  r->token.n-1]=='
e6a0: 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  \'' );.      n =
e6b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
e6c0: 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28  - 3;.      z = (
e6d0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
e6e0: 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20  en.z + 2;.      
e6f0: 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
e700: 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
e710: 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
e720: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e730: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
e740: 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
e750: 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
e760: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
e770: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
e780: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
e790: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
e7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e7b0: 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
e7c0: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  le, pExpr->iTabl
e7d0: 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  e, target);.    
e7e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
e7f0: 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
e800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e810: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
e820: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
e830: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
e840: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
e850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e860: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
e870: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
e880: 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Reg = pExpr->iTa
e890: 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ble;.      break
e8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e8b0: 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
e8c0: 69 6e 52 65 67 20 3d 20 63 6f 64 65 41 6c 69 61  inReg = codeAlia
e8d0: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
e8e0: 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
e8f0: 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
e900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e910: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
e920: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
e930: 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
e940: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
e950: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
e960: 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
e970: 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
e980: 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70    int aff, to_op
e990: 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
e9a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
e9b0: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
e9c0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
e9d0: 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  et);.      aff =
e9e0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
e9f0: 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Type(&pExpr->tok
ea00: 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
ea10: 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
ea20: 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
ea30: 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
ea40: 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
ea50: 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
ea60: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
ea70: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
ea80: 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
ea90: 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
eaa0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
eab0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
eac0: 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
ead0: 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
eae0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
eaf0: 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
eb00: 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
eb10: 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
eb20: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
eb30: 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
eb40: 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
eb50: 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
eb60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
eb70: 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
eb80: 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
eb90: 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
eba0: 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
ebb0: 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
ebc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
ebd0: 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
ebe0: 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
ebf0: 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
ec00: 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
ec10: 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
ec20: 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
ec30: 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
ec40: 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  get ){.        s
ec50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ec60: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e  (v, OP_SCopy, in
ec70: 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  Reg, target);.  
ec80: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
ec90: 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rget;.      }.  
eca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ecb0: 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20  ddOp1(v, to_op, 
ecc0: 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65  inReg);.      te
ecd0: 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f  stcase( usedAsCo
ece0: 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
ecf0: 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20  , inReg, inReg) 
ed00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ed10: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ed20: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
ed30: 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20  inReg, 1);.     
ed40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ed50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ed60: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
ed70: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
ed80: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
ed90: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
eda0: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
edb0: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
edc0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
edd0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
ede0: 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
edf0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
ee00: 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
ee10: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
ee20: 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
ee30: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
ee40: 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
ee50: 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
ee60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ee70: 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
ee80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ee90: 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
eea0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
eeb0: 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
eec0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
eed0: 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
eee0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
eef0: 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
ef00: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
ef10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ef20: 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
ef30: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
ef40: 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73 65  eOperands(pParse
ef50: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
ef60: 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a  &r1, &regFree1,.
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c    pExpr->pRight,
efa0: 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29   &r2, &regFree2)
efb0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
efc0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
efd0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
efe0: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
f000: 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
f010: 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
f020: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
f030: 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
f040: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
f050: 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
f060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f070: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
f080: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
f090: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
f0a0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
f0b0: 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
f0c0: 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
f0d0: 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
f0e0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
f0f0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
f100: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
f110: 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
f120: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
f130: 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
f140: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
f150: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f160: 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
f170: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f180: 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
f190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
f1a0: 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
f1b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f1c0: 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
f1d0: 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
f1e0: 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
f1f0: 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
f200: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
f210: 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
f220: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f230: 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
f240: 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
f250: 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
f260: 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
f270: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
f280: 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
f290: 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
f2a0: 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
f2b0: 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
f2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
f2d0: 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
f2e0: 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  at );.      test
f2f0: 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44  case( op==TK_AND
f300: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f310: 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  se( op==TK_OR );
f320: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f330: 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
f340: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f350: 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
f360: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f370: 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
f380: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
f390: 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20  ==TK_BITAND );. 
f3a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f3b0: 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
f3c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f3d0: 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20  p==TK_SLASH );. 
f3e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f3f0: 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
f400: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f410: 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
f420: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f430: 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
f440: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
f450: 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
f460: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f470: 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
f480: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
f490: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
f4a0: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
f4b0: 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
f4c0: 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
f4d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f4e0: 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
f4f0: 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
f500: 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
f510: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
f520: 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
f530: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f540: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f550: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
f560: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
f570: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
f580: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
f590: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
f5a0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
f5b0: 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
f5c0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
f5d0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
f5e0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
f5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
f600: 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
f610: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Left->token.z, p
f620: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 31  Left->token.n, 1
f630: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
f640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f650: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
f660: 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72  v, pLeft, 1, tar
f670: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  get);.        }.
f680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f690: 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
f6a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f6b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f6d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f6e0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29 3b  Integer, 0, r1);
f6f0: 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71  .        r2 = sq
f700: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
f710: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
f720: 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
f730: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
f740: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f750: 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32   OP_Subtract, r2
f760: 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
f770: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f780: 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
f790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
f7a0: 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
f7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f7c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
f7d0: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
f7e0: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
f7f0: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
f800: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
f810: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
f820: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
f830: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
f840: 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20  ==TK_BITNOT );. 
f850: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f860: 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20  p==TK_NOT );.   
f870: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
f880: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
f890: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f8a0: 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
f8b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
f8c0: 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
f8d0: 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
f8e0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f8f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
f900: 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , r1, inReg);.  
f910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f920: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
f930: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
f940: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
f950: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
f960: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
f970: 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
f980: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f990: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
f9a0: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
f9b0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f9c0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
f9d0: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
f9e0: 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
f9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fa10: 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
fa20: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
fa30: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
fa40: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fa50: 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
fa60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fa70: 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
fa80: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fa90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
faa0: 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
fab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fac0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fad0: 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20   target, -1);.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
faf0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
fb00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fb10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fb20: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
fb30: 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
fb40: 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
fb50: 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
fb60: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
fb70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
fb80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fb90: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
fba0: 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20  ate: %T",.      
fbb0: 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70        &pExpr->sp
fbc0: 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  an);.      }else
fbd0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
fbe0: 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
fbf0: 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
fc00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fc20: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
fc30: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
fc40: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
fc50: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
fc60: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
fc70: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
fc80: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
fc90: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
fca0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
fcb0: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
fcc0: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
fcd0: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
fce0: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
fcf0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
fd00: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
fd10: 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f  NC(db);.      Co
fd20: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
fd30: 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
fd40: 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
fd50: 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
fd60: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
fd70: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
fd80: 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
fd90: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
fda0: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
fdb0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
fdc0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
fdd0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
fde0: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
fdf0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
fe00: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
fe10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
fe20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  t ){.        nEx
fe30: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
fe40: 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
fe50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
fe60: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
fe70: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
fe80: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
fe90: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
fea0: 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  t, r1, 1);.     
feb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fec0: 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a  nExpr = r1 = 0;.
fed0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
fee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
fef0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
ff00: 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
ff10: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
ff20: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
ff30: 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
ff40: 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
ff50: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
ff60: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
ff70: 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
ff80: 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
ff90: 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
ffa0: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
ffb0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
ffc0: 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
ffd0: 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
ffe0: 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
fff0: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
10000 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
10010 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10020 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
10030 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
10040 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
10050 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
10060 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
10070 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
10080 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
10090 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
100a0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
100b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
100c0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
100d0 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
100e0 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
100f0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
10100 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
10110 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
10120 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
10130 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
10140 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
10150 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
10160 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
10170 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
10180 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
10190 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
101a0 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
101b0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
101c0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
101d0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
101e0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
101f0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
10200 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
10210 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10220 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
10230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
10240 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
10250 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
10260 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
10270 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
10280 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
10290 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
102a0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
102b0 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
102c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
102d0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
102e0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
102f0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
10300 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
10310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10320 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
10330 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
10340 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
10350 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
10360 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
10370 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
10380 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
10390 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
103a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
103b0 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
103c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
103d0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
103e0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
103f0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
10400 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
10410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10420 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
10430 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
10440 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
10450 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
10460 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
10470 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10480 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
10490 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
104a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
104b0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
104c0 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
104d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
104e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
104f0 28 75 38 29 6e 45 78 70 72 29 3b 0a 20 20 20 20  (u8)nExpr);.    
10500 20 20 69 66 28 20 6e 45 78 70 72 20 29 7b 0a 20    if( nExpr ){. 
10510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
10520 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
10530 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70 72  Parse, r1, nExpr
10540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10550 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10560 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
10570 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 45 78 70  pParse, r1, nExp
10580 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
10590 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
105a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
105b0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
105c0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
105d0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
105e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
105f0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
10600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
10610 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
10620 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
10630 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >iColumn==0 ){. 
10640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
10650 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
10660 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 30 29  se, pExpr, 0, 0)
10670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10680 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
10690 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72  Column;.      br
106a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
106b0 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
106c0 20 20 20 69 6e 74 20 72 4e 6f 74 46 6f 75 6e 64     int rNotFound
106d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
106e0 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
106f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 32 2c 20  ;.      int j2, 
10700 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20  j3, j4, j5;.    
10710 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
10720 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65  .      int eType
10730 3b 0a 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  ;..      VdbeNoo
10740 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
10750 67 69 6e 20 49 4e 20 65 78 70 72 20 72 25 64 22  gin IN expr r%d"
10760 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20  , target));.    
10770 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
10780 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
10790 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 4d 61  rse, pExpr, &rMa
107a0 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
107b0 20 20 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75    if( rMayHaveNu
107c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 4e  ll ){.        rN
107d0 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72  otFound = ++pPar
107e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
107f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  }..      /* Figu
10800 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
10810 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
10820 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
10830 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
10840 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
10850 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
10860 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
10870 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
10880 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
10890 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
108a0 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
108b0 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
108c0 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
108d0 74 79 28 70 45 78 70 72 29 3b 0a 0a 0a 20 20 20  ty(pExpr);...   
108e0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c     /* Code the <
108f0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
10900 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68  r> IN (...)". Th
10910 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
10920 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72  e.      ** pExpr
10930 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ->iTable contain
10940 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
10950 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e  t make up the (.
10960 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a  ..) set..      *
10970 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  /.      pParse->
10980 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
10990 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
109a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
109b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
109c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 70 50  arget);.      pP
109d0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
109e0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 6a  Cache--;.      j
109f0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
10a00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
10a10 6c 6c 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ll, target);.   
10a20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
10a30 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
10a40 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c          j3 = sql
10a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10a60 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10a70 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10a80 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j4 = sqlite3Vdb
10a90 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
10aa0 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e  tExists, pExpr->
10ab0 69 54 61 62 6c 65 2c 20 30 2c 20 74 61 72 67 65  iTable, 0, targe
10ac0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10ad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10ae0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10af0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
10b00 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
10b10 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
10b20 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  to);.        sql
10b30 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10b40 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20 20 20  (v, j3);.       
10b50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10b60 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20  Here(v, j4);.   
10b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10b90 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
10ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10bb0 20 20 20 20 20 20 20 72 32 20 3d 20 72 65 67 46         r2 = regF
10bc0 72 65 65 32 20 3d 20 73 71 6c 69 74 65 33 47 65  ree2 = sqlite3Ge
10bd0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
10be0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 72  ;..        /* Cr
10bf0 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 61 6e  eate a record an
10c00 64 20 74 65 73 74 20 66 6f 72 20 73 65 74 20 6d  d test for set m
10c10 65 6d 62 65 72 73 68 69 70 2e 20 49 66 20 74 68  embership. If th
10c20 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 0a 20  e set contains. 
10c30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61         ** the va
10c40 6c 75 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  lue, then jump t
10c50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
10c60 20 74 65 73 74 20 63 6f 64 65 2e 20 54 68 65 20   test code. The 
10c70 74 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 2a  target.        *
10c80 2a 20 72 65 67 69 73 74 65 72 20 73 74 69 6c 6c  * register still
10c90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72   contains the tr
10ca0 75 65 20 28 31 29 20 76 61 6c 75 65 20 77 72 69  ue (1) value wri
10cb0 74 74 65 6e 20 74 6f 20 69 74 20 65 61 72 6c 69  tten to it earli
10cc0 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  er..        */. 
10cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10ce0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
10cf0 61 6b 65 52 65 63 6f 72 64 2c 20 74 61 72 67 65  akeRecord, targe
10d00 74 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  t, 1, r2, &affin
10d10 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
10d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10d40 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
10d50 20 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74        j5 = sqlit
10d60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10d70 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
10d80 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b  >iTable, 0, r2);
10d90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
10da0 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68  the set membersh
10db0 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74  ip test fails, t
10dc0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
10dd0 66 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  f the .        *
10de0 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
10df0 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
10e00 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
10e10 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
10e20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
10e30 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  ns no NULL value
10e40 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
10e50 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20  lt is 0. If the 
10e60 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
10e70 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
10e80 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
10e90 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
10ea0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
10eb0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
10ec0 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20  s also NULL..   
10ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10ee0 69 66 28 20 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30  if( rNotFound==0
10ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
10f00 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
10f10 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
10f20 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
10f30 20 28 6e 6f 77 29 20 74 68 61 74 20 0a 20 20 20   (now) that .   
10f40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65         ** the se
10f50 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55  t contains no NU
10f60 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20  LL values. This 
10f70 68 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72  happens as the r
10f80 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20  esult.          
10f90 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c  ** of a "NOT NUL
10fa0 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  L" constraint in
10fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
10fc0 68 65 6d 61 2e 20 4e 6f 20 6e 65 65 64 0a 20 20  hema. No need.  
10fd0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
10fe0 73 74 20 74 68 65 20 64 61 74 61 20 73 74 72 75  st the data stru
10ff0 63 74 75 72 65 20 61 74 20 72 75 6e 74 69 6d 65  cture at runtime
11000 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
11010 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
11020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11030 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11040 74 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74  teger, 0, target
11050 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11060 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
11070 68 69 73 20 62 6c 6f 63 6b 20 70 6f 70 75 6c 61  his block popula
11080 74 65 73 20 74 68 65 20 72 4e 6f 74 46 6f 75 6e  tes the rNotFoun
11090 64 20 72 65 67 69 73 74 65 72 20 77 69 74 68 20  d register with 
110a0 65 69 74 68 65 72 20 4e 55 4c 4c 0a 20 20 20 20  either NULL.    
110b0 20 20 20 20 20 20 2a 2a 20 6f 72 20 30 20 28 61        ** or 0 (a
110c0 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 29  n integer value)
110d0 2e 20 49 66 20 74 68 65 20 64 61 74 61 20 73 74  . If the data st
110e0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
110f0 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a   one.          *
11100 2a 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c  * or more NULLs,
11110 20 74 68 65 6e 20 73 65 74 20 72 4e 6f 74 46 6f   then set rNotFo
11120 75 6e 64 20 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68  und to NULL. Oth
11130 65 72 77 69 73 65 2c 20 73 65 74 20 69 74 0a 20  erwise, set it. 
11140 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 30           ** to 0
11150 2e 20 49 66 20 72 65 67 69 73 74 65 72 20 72 4d  . If register rM
11160 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 61 6c  ayHaveNull is al
11170 72 65 61 64 79 20 73 65 74 20 74 6f 20 73 6f 6d  ready set to som
11180 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
11190 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20    ** other than 
111a0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74  NULL, then the t
111b0 65 73 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  est has already 
111c0 62 65 65 6e 20 72 75 6e 20 61 6e 64 20 0a 20 20  been run and .  
111d0 20 20 20 20 20 20 20 20 2a 2a 20 72 4e 6f 74 46          ** rNotF
111e0 6f 75 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20  ound is already 
111f0 70 6f 70 75 6c 61 74 65 64 2e 0a 20 20 20 20 20  populated..     
11200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11210 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
11220 68 61 72 20 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d  har nullRecord[]
11230 20 3d 20 7b 20 30 78 30 32 2c 20 30 78 30 30 20   = { 0x02, 0x00 
11240 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 33 20  };.          j3 
11250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11260 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
11270 6c 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29  l, rMayHaveNull)
11280 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
112a0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f   OP_Null, 0, rNo
112b0 74 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20  tFound);.       
112c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
112d0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
112e0 20 32 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   2, rMayHaveNull
112f0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 20 6e 75 6c 6c 52 65 63 6f 72 64 2c 20 50     nullRecord, P
11320 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
11330 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65       j4 = sqlite
11340 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11350 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
11360 69 54 61 62 6c 65 2c 20 30 2c 20 72 4d 61 79 48  iTable, 0, rMayH
11370 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  aveNull);.      
11380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
113a0 67 65 72 2c 20 30 2c 20 72 4e 6f 74 46 6f 75 6e  ger, 0, rNotFoun
113b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
113c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
113d0 65 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20  e(v, j4);.      
113e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
113f0 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a  umpHere(v, j3);.
11400 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
11410 70 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  py the value of 
11420 72 65 67 69 73 74 65 72 20 72 4e 6f 74 46 6f 75  register rNotFou
11430 6e 64 20 28 77 68 69 63 68 20 69 73 20 65 69 74  nd (which is eit
11440 68 65 72 20 4e 55 4c 4c 20 6f 72 20 30 29 0a 20  her NULL or 0). 
11450 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f           ** into
11460 20 74 68 65 20 74 61 72 67 65 74 20 72 65 67 69   the target regi
11470 73 74 65 72 2e 20 54 68 69 73 20 77 69 6c 6c 20  ster. This will 
11480 62 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  be the result of
11490 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
114a0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  * expression..  
114b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
114c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
114d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
114e0 79 2c 20 72 4e 6f 74 46 6f 75 6e 64 2c 20 74 61  y, rNotFound, ta
114f0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
11500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11510 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11520 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 20  re(v, j2);.     
11530 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11540 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20 20  Here(v, j5);.   
11550 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
11560 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72 20  v, "end IN expr 
11570 72 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a  r%d", target));.
11580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11590 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a   }.#endif.    /*
115a0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
115b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
115c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
115d0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
115e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
115f0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
11600 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
11610 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
11620 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
11630 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
11640 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11650 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
11660 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
11670 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11680 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
11690 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
116a0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
116b0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
116c0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
116d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
116e0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
116f0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b  pExpr->pList->a;
11700 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
11710 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
11720 78 70 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65  xpr;..      code
11730 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28  CompareOperands(
11740 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
11750 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20  r1, &regFree1,. 
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72   pRight, &r2, &r
11790 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
117a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
117b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
117c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
117d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
117e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
117f0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11800 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
11810 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11820 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
11830 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
11840 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
11850 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
11860 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
11870 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
11880 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
11890 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
118a0 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
118b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
118c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
118d0 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
118e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
118f0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
11900 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26  Parse, pRight, &
11910 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
11920 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
11930 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
11940 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11950 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
11960 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32  t, OP_Le, r1, r2
11970 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r4, SQLITE_STO
11980 52 45 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  REP2);.      sql
11990 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
119a0 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
119b0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
119c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
119d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
119e0 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
119f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11a00 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
11a10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11a20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
11a30 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
11a40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11a50 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
11a60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
11a70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
11a80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
11a90 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
11aa0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
11ab0 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
11ac0 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
11ad0 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
11ae0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
11af0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
11b00 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
11b10 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
11b20 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
11b30 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
11b40 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
11b50 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
11b60 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
11b70 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
11b80 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
11b90 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
11ba0 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
11bb0 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
11bc0 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
11bd0 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
11be0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
11bf0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
11c00 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
11c10 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
11c20 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
11c30 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
11c40 20 59 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e   Y is in pExpr->
11c50 70 52 69 67 68 74 2e 20 20 54 68 65 20 59 20 69  pRight.  The Y i
11c60 73 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e  s also optional.
11c70 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
11c80 0a 20 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61  .    ** ELSE cla
11c90 75 73 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  use and no other
11ca0 20 74 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74   term matches, t
11cb0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
11cc0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70  f the.    ** exp
11cd0 72 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a  rssion is NULL..
11ce0 20 20 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20      ** Ei is in 
11cf0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
11d00 69 2a 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70  i*2] and Ri is p
11d10 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
11d20 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20  *2+1]..    **.  
11d30 20 20 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20    ** The result 
11d40 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
11d50 6e 20 69 73 20 74 68 65 20 52 69 20 66 6f 72 20  n is the Ri for 
11d60 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
11d70 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72  ng Ei,.    ** or
11d80 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11d90 6d 61 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65  matching Ei, the
11da0 20 45 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72   ELSE term Y, or
11db0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   if there is.   
11dc0 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d   ** no ELSE term
11dd0 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  , NULL..    */. 
11de0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
11df0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64   {.      int end
11e00 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
11e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f             /* GO
11e20 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64  TO label for end
11e30 20 6f 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f   of CASE stmt */
11e40 0a 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43  .      int nextC
11e50 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
11e60 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
11e70 20 6c 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20   label for next 
11e80 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
11e90 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20       int nExpr; 
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d         /* 2x num
11ec0 62 65 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ber of WHEN term
11ed0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
11ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f00 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11f10 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
11f20 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
11f30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
11f40 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
11f50 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
11f60 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
11f70 73 74 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61  stelem;  /* Arra
11f80 79 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  y of WHEN terms 
11f90 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70  */.      Expr op
11fa0 43 6f 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20  Compare;        
11fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11fc0 65 20 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69  e X==Ei expressi
11fd0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  on */.      Expr
11fe0 20 63 61 63 68 65 58 3b 20 20 20 20 20 20 20 20   cacheX;        
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12000 20 43 61 63 68 65 64 20 65 78 70 72 65 73 73 69   Cached expressi
12010 6f 6e 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78  on X */.      Ex
12020 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 2f 2a 20 54 68 65 20 58 20 65 78 70 72 65 73 73  /* The X express
12050 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
12060 72 20 2a 70 54 65 73 74 20 3d 20 30 3b 20 20 20  r *pTest = 0;   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12080 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29  * X==Ei (form A)
12090 20 6f 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72   or just Ei (for
120a0 6d 20 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61  m B) */..      a
120b0 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
120c0 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
120d0 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
120e0 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
120f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12100 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
12110 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
12120 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
12130 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
12140 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
12150 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
12160 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
12170 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
12180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12190 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
121a0 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
121b0 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
121c0 20 20 20 20 20 20 20 63 61 63 68 65 58 20 3d 20         cacheX = 
121d0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73  *pX;.        tes
121e0 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54  tcase( pX->op==T
121f0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e  K_COLUMN || pX->
12200 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
12210 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  );.        cache
12220 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74  X.iTable = sqlit
12230 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12240 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46  Parse, pX, &regF
12250 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74  ree1);.        t
12260 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
12270 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
12280 63 61 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52  cacheX.op = TK_R
12290 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20  EGISTER;.       
122a0 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20   opCompare.op = 
122b0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f  TK_EQ;.        o
122c0 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d  pCompare.pLeft =
122d0 20 26 63 61 63 68 65 58 3b 0a 20 20 20 20 20 20   &cacheX;.      
122e0 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
122f0 70 61 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pare;.      }.  
12300 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
12310 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
12320 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12330 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
12340 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
12350 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
12360 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
12370 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
12380 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
12390 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
123a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
123b0 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
123c0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
123d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
123e0 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
123f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12400 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
12410 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
12420 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
12430 4e 20 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d  N || pTest->op==
12440 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
12450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12460 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
12470 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73  , pTest, nextCas
12480 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  e, SQLITE_JUMPIF
12490 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74  NULL);.        t
124a0 65 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c  estcase( aListel
124b0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f  em[i+1].pExpr->o
124c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
124d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
124e0 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
124f0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52  .pExpr->op==TK_R
12500 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
12510 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12520 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
12530 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
12540 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
12550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12560 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12570 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
12580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12590 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
125a0 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20   nextCase);.    
125b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
125c0 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
125d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
125e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
125f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61  Expr->pRight, ta
12600 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
12610 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12620 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12630 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
12640 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
12650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12660 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
12670 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
12680 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
12690 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
126a0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
126b0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
126c0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
126d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
126e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
126f0 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
12700 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
12710 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
12720 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
12730 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12740 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
12770 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
12780 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
12790 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
127a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
127b0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
127c0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
127d0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
127e0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
127f0 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
12800 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
12810 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
12820 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
12830 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
12840 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
12850 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
12860 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
12870 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
12880 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
12890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
128a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
128b0 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
128c0 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
128d0 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20  olumn, 0,.      
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
12900 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
12910 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
12920 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
12930 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12940 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49  >iColumn == OE_I
12950 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20  gnore );.       
12960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12970 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  Op2(v, OP_Contex
12980 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
12990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
129a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
129b0 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
129c0 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
129d0 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
129e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
129f0 22 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29  "raise(IGNORE)")
12a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
12a20 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
12a30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12a40 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
12a50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
12a60 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12a70 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
12a80 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d   return inReg;.}
12a90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12aa0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
12ab0 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
12ac0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
12ad0 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20  sults.** into a 
12ae0 72 65 67 69 73 74 65 72 2e 20 20 52 65 74 75 72  register.  Retur
12af0 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  n the register n
12b00 75 6d 62 65 72 20 77 68 65 72 65 20 74 68 65 20  umber where the 
12b10 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73  results.** are s
12b20 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tored..**.** If 
12b30 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73 20  the register is 
12b40 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  a temporary regi
12b50 73 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  ster that can be
12b60 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a   deallocated,.**
12b70 20 74 68 65 6e 20 77 72 69 74 65 20 69 74 73 20   then write its 
12b80 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65  number into *pRe
12b90 67 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  g.  If the resul
12ba0 74 20 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f  t register is no
12bb0 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  t.** a temporary
12bc0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67  , then set *pReg
12bd0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74   to zero..*/.int
12be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12bf0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
12c00 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
12c10 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
12c20 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
12c30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12c40 29 3b 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71  );.  int r2 = sq
12c50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
12c60 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
12c70 72 2c 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32  r, r1);.  if( r2
12c80 3d 3d 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65  ==r1 ){.    *pRe
12c90 67 20 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b  g = r1;.  }else{
12ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
12cb0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12cc0 65 2c 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65  e, r1);.    *pRe
12cd0 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 0;.  }.  ret
12ce0 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn r2;.}../*.**
12cf0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12d00 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
12d10 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
12d20 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  pr and store the
12d30 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72  .** results in r
12d40 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
12d50 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
12d60 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61   guaranteed to a
12d70 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69  ppear.** in regi
12d80 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a  ster target..*/.
12d90 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
12da0 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
12db0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
12dc0 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
12dd0 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73  nt inReg;..  ass
12de0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
12df0 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
12e00 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67  >nMem );.  inReg
12e10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12e20 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
12e30 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
12e40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
12e50 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72  e->pVdbe || pPar
12e60 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
12e70 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  iled );.  if( in
12e80 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
12e90 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
12ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12eb0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
12ec0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
12ed0 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
12ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67   }.  return targ
12ef0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
12f00 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
12f10 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
12f20 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
12f30 64 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c  d puts the resul
12f40 74 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  t.** in register
12f50 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   target..**.** A
12f60 6c 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  lso make a copy 
12f70 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
12f80 6e 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  n results into a
12f90 6e 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72  nother "cache" r
12fa0 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d  egister.** and m
12fb0 6f 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73  odify the expres
12fc0 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65  sion so that the
12fd0 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
12fe0 20 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74   evaluated,.** t
12ff0 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63  he result is a c
13000 6f 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65  opy of the cache
13010 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a   register..**.**
13020 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13030 20 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73   used for expres
13040 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  sions that are u
13050 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a  sed multiple .**
13060 20 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72   times.  They ar
13070 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65  e evaluated once
13080 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73   and the results
13090 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
130a0 6f 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64  on.** are reused
130b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
130c0 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
130d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
130e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
130f0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
13100 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
13110 64 62 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67  dbe;.  int inReg
13120 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
13130 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13140 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
13150 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61  t);.  assert( ta
13160 72 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  rget>0 );.  if( 
13170 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
13180 47 49 53 54 45 52 20 29 7b 20 20 0a 20 20 20 20  GISTER ){  .    
13190 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d  int iMem;.    iM
131a0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
131b0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
131c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
131d0 5f 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d  _Copy, inReg, iM
131e0 65 6d 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  em);.    pExpr->
131f0 69 54 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20  iTable = iMem;. 
13200 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
13210 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a  K_REGISTER;.  }.
13220 20 20 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a    return inReg;.
13230 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13240 54 52 55 45 20 69 66 20 70 45 78 70 72 20 69 73  TRUE if pExpr is
13250 20 61 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78 70   an constant exp
13260 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
13270 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66  appropriate.** f
13280 6f 72 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74  or factoring out
13290 20 6f 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70   of a loop.  App
132a0 72 6f 70 72 69 61 74 65 20 65 78 70 72 65 73 73  ropriate express
132b0 69 6f 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ions are:.**.** 
132c0 20 20 20 2a 20 20 41 6e 79 20 65 78 70 72 65 73     *  Any expres
132d0 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61  sion that evalua
132e0 74 65 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  tes to two or mo
132f0 72 65 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a  re opcodes..**.*
13300 2a 20 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49  *    *  Any OP_I
13310 6e 74 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c  nteger, OP_Real,
13320 20 4f 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42   OP_String, OP_B
13330 6c 6f 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a  lob, OP_Null, .*
13340 2a 20 20 20 20 20 20 20 6f 72 20 4f 50 5f 56 61  *       or OP_Va
13350 72 69 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73  riable that does
13360 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
13370 70 6c 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20  placed in a .** 
13380 20 20 20 20 20 20 73 70 65 63 69 66 69 63 20 72        specific r
13390 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
133a0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
133b0 20 69 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f 75   in factoring ou
133c0 74 20 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  t single-instruc
133d0 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  tion constant.**
133e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
133f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
13400 63 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  ced in a particu
13410 6c 61 72 20 72 65 67 69 73 74 65 72 2e 20 20 0a  lar register.  .
13420 2a 2a 20 57 65 20 63 6f 75 6c 64 20 66 61 63 74  ** We could fact
13430 6f 72 20 74 68 65 6d 20 6f 75 74 2c 20 62 75 74  or them out, but
13440 20 74 68 65 6e 20 77 65 20 77 6f 75 6c 64 20 65   then we would e
13450 6e 64 20 75 70 20 61 64 64 69 6e 67 20 61 6e 0a  nd up adding an.
13460 2a 2a 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74  ** OP_SCopy inst
13470 72 75 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ruction to move 
13480 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
13490 68 65 20 63 6f 72 72 65 63 74 20 72 65 67 69 73  he correct regis
134a0 74 65 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57  ter.** later.  W
134b0 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20  e might as well 
134c0 6a 75 73 74 20 75 73 65 20 74 68 65 20 6f 72 69  just use the ori
134d0 67 69 6e 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  ginal instructio
134e0 6e 20 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74  n and.** avoid t
134f0 68 65 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a  he OP_SCopy..*/.
13500 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 70 70  static int isApp
13510 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f  ropriateForFacto
13520 72 69 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a 20  ring(Expr *p){. 
13530 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
13540 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
13550 69 6e 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74  in(p) ){.    ret
13560 75 72 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20  urn 0;  /* Only 
13570 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
13580 69 6f 6e 73 20 61 72 65 20 61 70 70 72 6f 70 72  ions are appropr
13590 69 61 74 65 20 66 6f 72 20 66 61 63 74 6f 72 69  iate for factori
135a0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
135b0 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  (p->flags & EP_F
135c0 69 78 65 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a  ixedDest)==0 ){.
135d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
135e0 2a 20 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77  * Any constant w
135f0 69 74 68 6f 75 74 20 61 20 66 69 78 65 64 20 64  ithout a fixed d
13600 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 70  estination is ap
13610 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d  propriate */.  }
13620 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
13630 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d 20  =TK_UPLUS ) p = 
13640 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69 74  p->pLeft;.  swit
13650 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66  ch( p->op ){.#if
13660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13670 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
13680 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
13690 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
136a0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
136b0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
136c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
136d0 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
136e0 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  _NULL:.    case 
136f0 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
13700 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13710 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20  op==TK_BLOB );. 
13720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13730 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
13740 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
13750 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ase( p->op==TK_I
13760 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
13770 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13780 3d 54 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20  =TK_FLOAT );.   
13790 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
137a0 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20  op==TK_NULL );. 
137b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
137c0 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
137d0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 67  );.      /* Sing
137e0 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  le-instruction c
137f0 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 61 20  onstants with a 
13800 66 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f  fixed destinatio
13810 6e 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 62  n are.      ** b
13820 65 74 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69  etter done in-li
13830 6e 65 2e 20 20 49 66 20 77 65 20 66 61 63 74 6f  ne.  If we facto
13840 72 20 74 68 65 6d 2c 20 74 68 65 79 20 77 69 6c  r them, they wil
13850 6c 20 6a 75 73 74 20 65 6e 64 0a 20 20 20 20 20  l just end.     
13860 20 2a 2a 20 75 70 20 67 65 6e 65 72 61 74 69 6e   ** up generatin
13870 67 20 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f  g an OP_SCopy to
13880 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
13890 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  to the destinati
138a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 69  on.      ** regi
138b0 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ster. */.      r
138c0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
138d0 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
138e0 53 3a 20 7b 0a 20 20 20 20 20 20 20 69 66 28 20  S: {.       if( 
138f0 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
13900 5f 46 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65  _FLOAT || p->pLe
13910 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
13920 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  ER ){.         r
13930 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
13940 7d 0a 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }.       break;.
13950 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
13960 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
13970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13980 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
13990 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
139a0 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
139b0 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
139c0 70 72 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61  priate for.** fa
139d0 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61  ctoring out of a
139e0 20 6c 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c   loop, then eval
139f0 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
13a00 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  ion.** into a re
13a10 67 69 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65  gister and conve
13a20 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  rt the expressio
13a30 6e 20 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49  n into a TK_REGI
13a40 53 54 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69  STER.** expressi
13a50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
13a60 74 20 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28  t evalConstExpr(
13a70 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
13a80 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
13a90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
13aa0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
13ab0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
13ac0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
13ad0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
13ae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
13af0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13b00 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
13b10 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
13b20 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
13b30 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b  TK_CONST_FUNC: {
13b40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72  .      /* The ar
13b50 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e  guments to a fun
13b60 63 74 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78  ction have a fix
13b70 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  ed destination..
13b80 20 20 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68        ** Mark th
13b90 65 6d 20 74 68 69 73 20 77 61 79 20 74 6f 20 61  em this way to a
13ba0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 64 20 75  void generated u
13bb0 6e 6e 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79  nneeded OP_SCopy
13bc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
13bd0 63 74 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a  ctions. .      *
13be0 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
13bf0 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
13c00 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66  >pList;.      if
13c10 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
13c20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
13c30 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
13c40 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13c50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
13c60 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
13c70 20 66 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c   for(; i>0; i--,
13c80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
13c90 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
13ca0 70 45 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70  pExpr ) pItem->p
13cb0 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
13cc0 50 5f 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20  P_FixedDest;.   
13cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13ce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13cf0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70  }.  }.  if( isAp
13d00 70 72 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74  propriateForFact
13d10 6f 72 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a  oring(pExpr) ){.
13d20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70      int r1 = ++p
13d30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
13d40 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20   int r2;.    r2 
13d50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13d60 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
13d70 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20  pExpr, r1);.    
13d80 69 66 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c  if( r1!=r2 ) sql
13d90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13da0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13db0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
13dc0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
13dd0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
13de0 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   r2;.    return 
13df0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
13e00 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
13e10 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  inue;.}../*.** P
13e20 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74  reevaluate const
13e30 61 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f  ant subexpressio
13e40 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20  ns within pExpr 
13e50 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
13e60 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
13e70 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70  sters.  Modify p
13e80 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65  Expr so that the
13e90 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
13ea0 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54  resions.** are T
13eb0 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64  K_REGISTER opcod
13ec0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
13ed0 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64   the precomputed
13ee0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64   values..*/.void
13ef0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13f00 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20  Constants(Parse 
13f10 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13f20 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
13f30 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
13f40 62 61 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74  back = evalConst
13f50 45 78 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Expr;.  w.xSelec
13f60 74 43 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  tCallback = 0;. 
13f70 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
13f80 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
13f90 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
13fa0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
13fb0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
13fc0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
13fd0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
13fe0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
13ff0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
14000 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
14010 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
14020 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
14030 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
14040 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
14050 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
14060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14070 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
14080 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14090 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
140a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
140b0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
140c0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
140d0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
140e0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61  oded */.  int ta
140f0 72 67 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  rget,        /* 
14100 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 72  Where to write r
14110 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
14120 64 6f 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f  doHardCopy     /
14130 2a 20 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f  * Make a hard co
14140 70 79 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  py of every elem
14150 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ent */.){.  stru
14160 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
14170 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
14180 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
14190 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  List!=0 );.  ass
141a0 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b  ert( target>0 );
141b0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
141c0 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
141d0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
141e0 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
141f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
14200 6d 2d 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->iAlias ){.   
14210 20 20 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f     int iReg = co
14220 64 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  deAlias(pParse, 
14230 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70  pItem->iAlias, p
14240 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72  Item->pExpr, tar
14250 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  get+i);.      Vd
14260 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
14270 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14280 20 20 20 20 20 20 69 66 28 20 69 52 65 67 21 3d        if( iReg!=
14290 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
142a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
142b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
142c0 79 2c 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b  y, iReg, target+
142d0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
142e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
142f0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14300 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
14310 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
14320 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61    }.    if( doHa
14330 72 64 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20  rdCopy ){.      
14340 73 71 6c 69 74 65 33 45 78 70 72 48 61 72 64 43  sqlite3ExprHardC
14350 6f 70 79 28 70 50 61 72 73 65 2c 20 74 61 72 67  opy(pParse, targ
14360 65 74 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  et, n);.    }.  
14370 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
14380 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14390 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
143a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
143b0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
143c0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
143d0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
143e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
143f0 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
14400 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
14410 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
14420 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
14430 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
14440 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
14450 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
14460 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
14470 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
14480 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
14490 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
144a0 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
144b0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
144c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  LL..**.** This c
144d0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
144e0 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
144f0 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
14500 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
14510 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
14520 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
14530 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
14540 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
14550 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
14560 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
14570 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
14580 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
14590 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
145a0 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
145b0 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
145c0 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
145d0 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
145e0 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
145f0 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
14600 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
14610 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
14620 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
14630 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
14640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
14650 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
14660 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
14670 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
14680 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
14690 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
146a0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
146b0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
146c0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
146d0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
146e0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
146f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
14700 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
14710 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
14720 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
14730 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
14740 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
14750 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
14760 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
14770 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
14780 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14790 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
147a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
147b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
147c0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
147d0 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
147e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
147f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
14800 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
14810 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
14820 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
14830 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14840 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
14850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14860 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14870 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14880 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
14890 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
148a0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
148b0 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
148c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
148d0 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
148e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
148f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14900 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
14910 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14920 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
14930 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
14940 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
14950 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 72    testcase( pPar
14960 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14970 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  che==0 );.      
14980 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14990 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
149a0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
149b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
149c0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
149d0 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20  ColCache++;.    
149e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
149f0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
14a00 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
14a10 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
14a20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14a30 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14a40 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  che>0 );.      p
14a50 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14a60 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20  lCache--;.      
14a70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14a80 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
14a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14aa0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
14ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14ac0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
14ad0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14ae0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14af0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14b00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14b10 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
14b20 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
14b30 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
14b40 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
14b50 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
14b60 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
14b70 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
14b80 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
14b90 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
14ba0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14bb0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
14bc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14bd0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
14be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14bf0 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
14c00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
14c10 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
14c20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14c30 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_LT );.      t
14c40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14c50 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LE );.      test
14c60 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20  case( op==TK_GT 
14c70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14c80 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a  e( op==TK_GE );.
14c90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ca0 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
14cb0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14cc0 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
14cd0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
14ce0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
14cf0 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
14d00 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70 45 78  ands(pParse, pEx
14d10 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20  pr->pLeft, &r1, 
14d20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
14d50 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c  pr->pRight, &r2,
14d60 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
14d70 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
14d80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14d90 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
14da0 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
14db0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
14dc0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
14dd0 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ll);.      testc
14de0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
14df0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14e00 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
14e10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14e20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
14e30 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
14e40 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
14e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
14e60 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
14e70 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
14e80 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
14e90 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
14ea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14eb0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
14ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14ed0 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
14ee0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
14ef0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
14f00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
14f10 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
14f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
14f40 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
14f50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
14f60 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
14f70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14f80 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
14f90 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  EN: {.      /*  
14fa0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
14fb0 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  D z.      **.   
14fc0 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c     ** Is equival
14fd0 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ent to .      **
14fe0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  .      **    x>=
14ff0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20  y AND x<=z.     
15000 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64   **.      ** Cod
15010 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
15020 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
15030 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
15040 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
15050 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  * elementation o
15060 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  f x..      */.  
15070 20 20 20 20 45 78 70 72 20 65 78 70 72 41 6e 64      Expr exprAnd
15080 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
15090 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
150a0 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20  r compRight;.   
150b0 20 20 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a     Expr exprX;..
150c0 20 20 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70        exprX = *p
150d0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
150e0 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20     exprAnd.op = 
150f0 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78  TK_AND;.      ex
15100 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63  prAnd.pLeft = &c
15110 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ompLeft;.      e
15120 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
15130 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20  &compRight;.    
15140 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
15150 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d  TK_GE;.      com
15160 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
15170 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
15180 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45  Left.pRight = pE
15190 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
151a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f  .pExpr;.      co
151b0 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
151c0 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  LE;.      compRi
151d0 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  ght.pLeft = &exp
151e0 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  rX;.      compRi
151f0 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
15200 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
15210 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70  pExpr;.      exp
15220 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69  rX.iTable = sqli
15230 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
15240 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
15250 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
15260 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15270 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15280 20 65 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52   exprX.op = TK_R
15290 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74  EGISTER;.      t
152a0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
152b0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
152c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
152d0 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
152e0 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
152f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
15300 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
15310 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
15320 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15330 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15340 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
15350 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15360 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15370 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  _If, r1, dest, j
15380 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
15390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
153a0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
153b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
153c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
153d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
153e0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
153f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15400 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
15410 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
15420 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15430 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
15440 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15450 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
15460 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
15470 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
15480 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
15490 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
154a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
154b0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
154c0 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
154d0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
154e0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
154f0 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
15500 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
15510 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
15520 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
15530 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
15540 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
15550 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
15560 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
15570 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
15580 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
15590 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
155a0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
155b0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
155c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
155d0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
155e0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
155f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
15600 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
15610 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
15620 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
15630 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
15640 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
15650 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
15660 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15670 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
15680 30 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  0 );.  if( v==0 
15690 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
156a0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
156b0 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
156c0 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
156d0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
156e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
156f0 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
15700 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
15710 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
15720 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
15730 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
15740 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
15750 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
15760 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
15770 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
15780 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
15790 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
157a0 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
157b0 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
157c0 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
157d0 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
157e0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
157f0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
15810 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
15820 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
15830 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
15840 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
15850 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
15860 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
15870 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
15880 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
15890 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
158a0 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
158b0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
158c0 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
158d0 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
158e0 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
158f0 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
15900 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
15910 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
15920 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
15930 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
15940 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
15950 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
15960 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
15970 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
15980 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
15990 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
159a0 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
159b0 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
159c0 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
159d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
159e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
159f0 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
15a00 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
15a10 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
15a20 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
15a30 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
15a40 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
15a50 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
15a60 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
15a70 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
15a80 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
15a90 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
15aa0 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
15ab0 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
15ac0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
15ad0 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
15ae0 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
15af0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
15b00 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
15b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
15b20 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
15b30 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
15b40 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
15b50 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
15b60 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
15b70 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
15b80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ll==0 );.      t
15b90 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
15ba0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
15bc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15bd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15be0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
15bf0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70  IfNull);.      p
15c00 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
15c10 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
15c20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
15c30 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
15c40 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
15c50 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
15c60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15c70 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15c80 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50  he>0 );.      pP
15c90 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
15ca0 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62  Cache--;.      b
15cb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15cc0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
15cd0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
15ce0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15cf0 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
15d00 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
15d20 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
15d30 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d  isableColCache==
15d40 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
15d50 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
15d60 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15d70 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c  t, d2, jumpIfNul
15d80 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
15d90 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ULL);.      pPar
15da0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15db0 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
15dc0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
15dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15de0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
15df0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
15e00 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15e10 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
15e20 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
15e30 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15e40 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
15e50 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15e60 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
15e70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15e80 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
15e90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15ea0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
15eb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15ec0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
15ed0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ee0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15ef0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
15f00 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
15f10 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
15f20 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
15f30 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
15f40 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_EQ: {.      te
15f50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
15f60 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15f70 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29  ase( op==TK_LE )
15f80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15f90 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20  ( op==TK_GT );. 
15fa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15fb0 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
15fc0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15fd0 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74  TK_EQ );.      t
15fe0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
15ff0 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  NE );.      test
16000 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
16010 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
16020 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73  eCompareOperands
16030 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16040 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67  pLeft, &r1, &reg
16050 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20  Free1,.         
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
16080 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65  pRight, &r2, &re
16090 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
160a0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
160b0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
160c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
160d0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
160e0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65        r1, r2, de
160f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
16100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16110 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16130 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16150 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
16160 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
16170 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
16180 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16190 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
161a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
161b0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
161c0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
161d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
161e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
161f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16210 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
16220 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
16230 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16240 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
16250 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16260 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
16270 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20  : {.      /*    
16280 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
16290 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
162a0 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e   ** Is equivalen
162b0 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20  t to .      **. 
162c0 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20       **    x>=y 
162d0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a  AND x<=z.      *
162e0 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20  *.      ** Code 
162f0 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
16300 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
16310 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
16320 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
16330 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  elementation of 
16340 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
16350 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a    Expr exprAnd;.
16360 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c        Expr compL
16370 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
16380 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
16390 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20   Expr exprX;..  
163a0 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78      exprX = *pEx
163b0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
163c0 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
163d0 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72  _AND;.      expr
163e0 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
163f0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
16400 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
16410 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
16420 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
16430 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  _GE;.      compL
16440 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
16450 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  rX;.      compLe
16460 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
16470 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
16480 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70  Expr;.      comp
16490 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
164a0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
164b0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
164c0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
164d0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
164e0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
164f0 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58  xpr;.      exprX
16500 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
16510 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16520 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
16530 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16540 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16550 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  e1==0 );.      e
16560 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
16570 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73  ISTER;.      tes
16580 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
16590 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
165a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
165b0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
165c0 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
165d0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
165e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
165f0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31  ault: {.      r1
16600 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16610 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16620 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
16630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16640 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16650 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
16660 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
16670 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16680 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
166a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
166b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
166c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
166d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
166e0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
166f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16700 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16710 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a  e, regFree2);.}.
16720 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
16730 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
16740 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
16750 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
16760 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
16770 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
16780 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
16790 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
167a0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
167b0 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
167c0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
167d0 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
167e0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
167f0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
16800 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
16810 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
16820 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
16830 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
16840 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
16850 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
16860 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
16870 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
16880 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
16890 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
168a0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
168b0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
168c0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
168d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
168e0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
168f0 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
16900 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
16910 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
16920 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
16930 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
16940 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
16950 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
16960 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
16970 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
16980 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
16990 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
169a0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
169b0 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
169c0 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
169d0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
169e0 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
169f0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
16a00 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
16a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
16a20 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
16a30 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
16a40 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
16a50 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
16a60 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
16a70 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
16a80 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
16a90 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
16aa0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
16ab0 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
16ac0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
16ad0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16ae0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
16af0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
16b00 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
16b10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
16b20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
16b30 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
16b40 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
16b50 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
16b60 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
16b70 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
16b80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
16b90 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
16ba0 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
16bb0 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
16bc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16bd0 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
16be0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
16bf0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
16c00 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
16c10 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
16c20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
16c30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
16c40 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
16c50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
16c60 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
16c70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16c80 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
16c90 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
16ca0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
16cb0 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
16cc0 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
16cd0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
16ce0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
16cf0 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
16d00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
16d10 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
16d20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
16d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16d40 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
16d50 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
16d60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
16d70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
16d80 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
16d90 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
16da0 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
16db0 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
16dc0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16dd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16de0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
16df0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
16e00 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
16e10 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
16e20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
16e30 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
16e40 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
16e50 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
16e60 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
16e70 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
16e80 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
16e90 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
16ea0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
16eb0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
16ec0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
16ed0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
16ee0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
16ef0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
16f00 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
16f10 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
16f20 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
16f30 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
16f40 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
16f50 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
16f60 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
16f70 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
16f80 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
16f90 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
16fa0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
16fb0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
16fc0 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
16fd0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
16fe0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
16ff0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
17000 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
17010 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
17020 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
17030 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
17040 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
17050 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
17060 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
17070 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
17080 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
17090 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
170a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
170b0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
170c0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
170d0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
170e0 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
170f0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
17100 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
17110 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
17120 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
17130 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
17140 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
17150 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
17160 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
17170 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
17180 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
17190 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
171a0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
171b0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
171c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
171d0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
171e0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
171f0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
17200 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
17210 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
17220 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
17230 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
17240 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
17250 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
17260 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
17270 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
17280 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
17290 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
172a0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
172b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
172c0 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
172d0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
172e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
172f0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
17300 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
17310 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
17320 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
17330 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
17340 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
17350 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
17360 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
17370 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
17380 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
17390 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
173a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
173b0 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
173c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
173d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
173e0 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
173f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
17400 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
17410 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
17420 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
17430 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
17440 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17450 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
17460 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
17470 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
17480 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
17490 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
174a0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
174b0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
174c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
174d0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
174e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
174f0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
17500 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
17510 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
17520 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
17530 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
17540 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
17550 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
17560 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
17570 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
17580 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
17590 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
175a0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
175b0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
175c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
175d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
175e0 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
175f0 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
17600 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
17610 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
17620 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
17630 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
17640 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
17650 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
17660 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
17670 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
17690 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
176a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
176b0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
176c0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
176d0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
176e0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
176f0 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
17700 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
17710 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
17720 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
17730 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
17740 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
17750 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
17760 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
17770 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
17780 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
17790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
177a0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
177b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
177d0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ol->iMem = ++pPa
177e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
177f0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
17800 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
17810 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
17820 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
17830 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
17840 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
17850 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
17870 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
17880 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
17890 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
178a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
178b0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
178c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
178d0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
178e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
178f0 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
17900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17910 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
17920 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
17950 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
17960 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17970 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
17980 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
17990 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
179a0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
179b0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
179c0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
179d0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
179e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
179f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
17a00 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
17a10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
17a40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
17a60 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
17a70 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
17aa0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
17ab0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
17ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17ad0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17af0 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
17b00 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
17b10 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
17b20 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
17b30 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
17b40 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
17b50 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
17b60 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
17b70 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
17b80 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
17b90 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
17ba0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
17bb0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
17bc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
17bd0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
17be0 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
17bf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17c00 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
17c10 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
17c20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
17c30 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
17c40 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
17c50 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b  pExpr->iAgg = k;
17c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
17c70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
17c80 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
17c90 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
17ca0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
17cb0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
17cc0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
17cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17ce0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
17cf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17d00 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
17d10 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
17d20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74  pNC->nDepth==0 t
17d30 65 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65  est causes aggre
17d40 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
17d50 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  n subqueries.   
17d60 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f     ** to be igno
17d70 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
17d80 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
17d90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
17da0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
17db0 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
17dc0 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
17dd0 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
17de0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
17df0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
17e00 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
17e10 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
17e20 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
17e30 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
17e40 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
17e50 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
17e60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
17e70 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
17e80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
17e90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17ea0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
17eb0 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29  m->pExpr, pExpr)
17ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17ed0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
17ee0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17ef0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
17f00 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
17f10 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
17f20 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
17f30 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
17f40 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
17f50 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
17f60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
17f70 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
17f80 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
17f90 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
17fa0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
17fb0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
17fc0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
17fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
17fe0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
17ff0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
18000 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
18010 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
18020 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
18030 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
18040 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
18050 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
18060 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
18070 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
18080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18090 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
180a0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
180b0 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
180d0 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
180e0 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
180f0 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
18100 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
18110 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
18120 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
18130 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
18140 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
18150 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18160 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
18170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
18180 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
18190 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
181a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
181b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
181c0 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
181d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
181e0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
181f0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
18200 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18210 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
18220 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  = i;.        pEx
18230 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
18240 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
18250 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
18260 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
18270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
18280 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
18290 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
182a0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
182b0 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
182c0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
182d0 65 63 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  ect){.  NameCont
182e0 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b  ext *pNC = pWalk
182f0 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28  er->u.pNC;.  if(
18300 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
18310 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
18320 74 68 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  th++;.    sqlite
18330 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
18340 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  ker, pSelect);. 
18350 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d     pNC->nDepth--
18360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
18370 5f 50 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  _Prune;.  }else{
18380 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
18390 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
183a0 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
183b0 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
183c0 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
183d0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
183e0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
183f0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
18400 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
18410 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
18420 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
18430 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
18440 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
18450 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
18460 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
18470 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18480 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
18490 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
184a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
184b0 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
184c0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65  zed by sqlite3Re
184d0 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
184e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
184f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
18500 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65  egates(NameConte
18510 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70  xt *pNC, Expr *p
18520 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  Expr){.  Walker 
18530 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
18540 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
18550 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
18560 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
18570 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
18580 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
18590 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c  pNC = pNC;.  sql
185a0 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
185b0 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
185c0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
185d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
185e0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
185f0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
18600 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
18610 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
18620 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
18630 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
18640 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
18650 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
18660 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69  ut short..*/.voi
18670 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  d sqlite3ExprAna
18680 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
18690 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
186a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
186b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
186c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
186d0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
186e0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
186f0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
18700 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18710 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
18720 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18730 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
18740 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
18750 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
18760 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
18770 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
18780 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73  ate temporary us
18790 65 20 72 65 67 69 73 74 65 72 73 20 64 75 72 69  e registers duri
187a0 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
187b0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
187c0 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
187d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
187e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
187f0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
18800 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
18810 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
18820 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
18830 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
18840 6d 70 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20 73  mpReg];.}.void s
18850 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
18860 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
18870 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
18880 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
18890 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
188a0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
188b0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
188c0 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69 74   sqlite3ExprWrit
188d0 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50 61  ableRegister(pPa
188e0 72 73 65 2c 20 69 52 65 67 2c 20 69 52 65 67 29  rse, iReg, iReg)
188f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54  ;.    pParse->aT
18900 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e  empReg[pParse->n
18910 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65  TempReg++] = iRe
18920 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
18930 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c  Allocate or deal
18940 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f  locate a block o
18950 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69  f nReg consecuti
18960 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a  ve registers.*/.
18970 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
18980 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
18990 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29  Parse, int nReg)
189a0 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  {.  int i, n;.  
189b0 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e  i = pParse->iRan
189c0 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61  geReg;.  n = pPa
189d0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a  rse->nRangeReg;.
189e0 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26    if( nReg<=n &&
189f0 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61   !usedAsColumnCa
18a00 63 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69  che(pParse, i, i
18a10 2b 6e 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61  +n-1) ){.    pPa
18a20 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b  rse->iRangeReg +
18a30 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
18a40 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d  se->nRangeReg -=
18a50 20 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nReg;.  }else{.
18a60 20 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e      i = pParse->
18a70 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
18a80 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67  se->nMem += nReg
18a90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
18aa0 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
18ab0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
18ac0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18ad0 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
18ae0 65 67 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e  eg){.  if( nReg>
18af0 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
18b00 67 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  g ){.    pParse-
18b10 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65  >nRangeReg = nRe
18b20 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  g;.    pParse->i
18b30 52 61 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b  RangeReg = iReg;
18b40 0a 20 20 7d 0a 7d 0a                             .  }.}.