/ Hex Artifact Content
Login

Artifact ee295129a9efa0466ae4ebdb03adc33cd5c2e184:


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 36 20 32 30 30 38 2f 31 32 2f 30 38 20  .406 2008/12/08 
0220: 31 33 3a 34 32 3a 33 36 20 64 72 68 20 45 78 70  13:42:36 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 73 71 6c 69 74 65 33  .  aff = sqlite3
1760: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
1770: 70 45 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a  pExpr1, aff) | j
1780: 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  umpIfNull;.  ret
1790: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
17a0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
17b0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
17c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
17d0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
17e0: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
17f0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1800: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1810: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1820: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1830: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1840: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1850: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
1860: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
1870: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
1880: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1890: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
18a0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
18b0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
18c0: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
18d0: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
18e0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
18f0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1900: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67   type..**.** Arg
1910: 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75  ument pRight (bu
1920: 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79  t not pLeft) may
1930: 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   be a null point
1940: 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  er. In this case
1950: 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63  ,.** it is not c
1960: 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f  onsidered..*/.Co
1970: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69  llSeq *sqlite3Bi
1980: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1990: 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eq(.  Parse *pPa
19a0: 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c  rse, .  Expr *pL
19b0: 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52  eft, .  Expr *pR
19c0: 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  ight.){.  CollSe
19d0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65  q *pColl;.  asse
19e0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69  rt( pLeft );.  i
19f0: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1a00: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1a10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a20: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Left->pColl );. 
1a30: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74     pColl = pLeft
1a40: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65  ->pColl;.  }else
1a50: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
1a60: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1a70: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
1a90: 68 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ht->pColl );.   
1aa0: 20 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d   pColl = pRight-
1ab0: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b  >pColl;.  }else{
1ac0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1ad0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1ae0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
1af0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1b00: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
1b10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1b20: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1b30: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1b40: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1b50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1b60: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72  the operands for
1b70: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1b80: 65 72 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65  eration.  Before
1b90: 0a 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74  .** generating t
1ba0: 68 65 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68  he code for each
1bb0: 20 6f 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68   operand, set th
1bc0: 65 20 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66  e EP_AnyAff.** f
1bd0: 6c 61 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65  lag on the expre
1be0: 73 73 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74  ssion so that it
1bf0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c00: 20 75 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65   used a.** cache
1c10: 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74  d column value t
1c20: 68 61 74 20 68 61 73 20 70 72 65 76 69 6f 75 73  hat has previous
1c30: 6c 79 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a  ly undergone an.
1c40: 2a 2a 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  ** affinity chan
1c50: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c60: 69 64 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70  id codeCompareOp
1c70: 65 72 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20  erands(.  Parse 
1c80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1c90: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1ca0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1cb0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1cc0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1cd0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1ce0: 0a 20 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74  .  int *pRegLeft
1cf0: 2c 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ,    /* Register
1d00: 20 77 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72   where left oper
1d10: 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f  and is stored */
1d20: 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66  .  int *pFreeLef
1d30: 74 2c 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69  t,   /* Free thi
1d40: 73 20 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s register when 
1d50: 64 6f 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  done */.  Expr *
1d60: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1d70: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d80: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52   */.  int *pRegR
1d90: 69 67 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73  ight,   /* Regis
1da0: 74 65 72 20 77 68 65 72 65 20 72 69 67 68 74 20  ter where right 
1db0: 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65  operand is store
1dc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65  d */.  int *pFre
1dd0: 65 52 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74  eRight   /* Writ
1de0: 65 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 20  e temp register 
1df0: 66 6f 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e  for right operan
1e00: 64 20 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  d there */.){.  
1e10: 77 68 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70  while( pLeft->op
1e20: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65  ==TK_UPLUS ) pLe
1e30: 66 74 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66  ft = pLeft->pLef
1e40: 74 3b 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67  t;.  pLeft->flag
1e50: 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a  s |= EP_AnyAff;.
1e60: 20 20 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71    *pRegLeft = sq
1e70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e80: 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  p(pParse, pLeft,
1e90: 20 70 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77   pFreeLeft);.  w
1ea0: 68 69 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70  hile( pRight->op
1eb0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69  ==TK_UPLUS ) pRi
1ec0: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  ght = pRight->pL
1ed0: 65 66 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66  eft;.  pRight->f
1ee0: 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66  lags |= EP_AnyAf
1ef0: 66 3b 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20  f;.  *pRegRight 
1f00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f10: 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
1f20: 69 67 68 74 2c 20 70 46 72 65 65 52 69 67 68 74  ight, pFreeRight
1f30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f40: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1f60: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
1f70: 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a  nt codeCompare(.
1f80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1fa0: 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e  ng (and code gen
1fb0: 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74  erating) context
1fc0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1fe0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1ff0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2000: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
2010: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2020: 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f   opcode,       /
2030: 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * The comparison
2040: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
2050: 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f   in1, int in2, /
2060: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
2070: 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20  ng operands */. 
2080: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
2090: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
20a0: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
20b0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
20c0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
20d0: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
20e0: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
20f0: 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e  {.  int p5;.  in
2100: 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65  t addr;.  CollSe
2110: 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73  q *p4;..  p4 = s
2120: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
2130: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
2140: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
2150: 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79  );.  p5 = binary
2160: 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c  CompareP5(pLeft,
2170: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
2180: 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  ull);.  addr = s
2190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21a0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
21b0: 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73  opcode, in2, des
21c0: 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20  t, in1,.        
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34     (void*)p4, P4
21f0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c  _COLLSEQ);.  sql
2200: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2210: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2220: 70 35 29 3b 0a 20 20 69 66 28 20 28 70 35 20 26  p5);.  if( (p5 &
2230: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
2240: 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )!=SQLITE_AFF_NO
2250: 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
2260: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
2270: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
2280: 20 69 6e 31 2c 20 31 29 3b 0a 20 20 20 20 73 71   in1, 1);.    sq
2290: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
22a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
22b0: 72 73 65 2c 20 69 6e 32 2c 20 31 29 3b 0a 20 20  rse, in2, 1);.  
22c0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
22d0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
22e0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
22f0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2300: 20 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68   argument nHeigh
2310: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
2320: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d  r equal to the m
2330: 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73  aximum.** expres
2340: 73 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77  sion depth allow
2350: 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
2360: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2370: 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70   message in.** p
2380: 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Parse..*/.int sq
2390: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
23a0: 69 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72  ight(Parse *pPar
23b0: 73 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29  se, int nHeight)
23c0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23d0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78  ITE_OK;.  int mx
23e0: 48 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d  Height = pParse-
23f0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2400: 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
2410: 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69  PTH];.  if( nHei
2420: 67 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a  ght>mxHeight ){.
2430: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2440: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
2450: 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20      "Expression 
2460: 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  tree is too larg
2470: 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68  e (maximum depth
2480: 20 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a   %d)", mxHeight.
2490: 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
24a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
24b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24c0: 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
24d0: 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ng three functio
24e0: 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  ns, heightOfExpr
24f0: 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72  (), heightOfExpr
2500: 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65  List().** and he
2510: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20  ightOfSelect(), 
2520: 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65  are used to dete
2530: 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75  rmine the maximu
2540: 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61  m height.** of a
2550: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2560: 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ee referenced by
2570: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2580: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
2590: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
25a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61  **.** If this ma
25b0: 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20  ximum height is 
25c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
25d0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70   current value p
25e0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
25f0: 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65  pnHeight, the se
2600: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20  cond parameter, 
2610: 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67  then set *pnHeig
2620: 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61  ht to that.** va
2630: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lue..*/.static v
2640: 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72  oid heightOfExpr
2650: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
2660: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
2670: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2680: 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68  nHeight>*pnHeigh
2690: 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65  t ){.      *pnHe
26a0: 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68  ight = p->nHeigh
26b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  t;.    }.  }.}.s
26c0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
26d0: 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72  tOfExprList(Expr
26e0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  List *p, int *pn
26f0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2700: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2710: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2720: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
2730: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2740: 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  (p->a[i].pExpr, 
2750: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d  pnHeight);.    }
2760: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2770: 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  id heightOfSelec
2780: 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  t(Select *p, int
2790: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
27a0: 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67  f( p ){.    heig
27b0: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65  htOfExpr(p->pWhe
27c0: 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  re, pnHeight);. 
27d0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
27e0: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65  p->pHaving, pnHe
27f0: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
2800: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69  tOfExpr(p->pLimi
2810: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
2820: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2830: 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69  ->pOffset, pnHei
2840: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2850: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  OfExprList(p->pE
2860: 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  List, pnHeight);
2870: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2880: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
2890: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
28a0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
28b0: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
28c0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
28d0: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
28e0: 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68  >pPrior, pnHeigh
28f0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2900: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48   Set the Expr.nH
2910: 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69  eight variable i
2920: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
2930: 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a  passed as an .**
2940: 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78   argument. An ex
2950: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f  pression with no
2960: 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e   children, Expr.
2970: 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70  pList or .** Exp
2980: 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72  r.pSelect member
2990: 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66   has a height of
29a0: 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78   1. Any other ex
29b0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20  pression.** has 
29c0: 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74  a height equal t
29d0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
29e0: 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65  ight of any othe
29f0: 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  r .** referenced
2a00: 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a   Expr plus one..
2a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
2a20: 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70  xprSetHeight(Exp
2a30: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65  r *p){.  int nHe
2a40: 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67  ight = 0;.  heig
2a50: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66  htOfExpr(p->pLef
2a60: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
2a70: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2a80: 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74  pRight, &nHeight
2a90: 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  );.  heightOfExp
2aa0: 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20  rList(p->pList, 
2ab0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
2ac0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
2ad0: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2ae0: 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20  );.  p->nHeight 
2af0: 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d  = nHeight + 1;.}
2b00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2b10: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
2b20: 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20  iable using the 
2b30: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20  exprSetHeight() 
2b40: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  function. If.** 
2b50: 74 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72  the height is gr
2b60: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d  eater than the m
2b70: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
2b80: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c  xpression depth,
2b90: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
2ba0: 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  or in pParse..*/
2bb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2bc0: 72 53 65 74 48 65 69 67 68 74 28 50 61 72 73 65  rSetHeight(Parse
2bd0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2be0: 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48 65 69  p){.  exprSetHei
2bf0: 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ght(p);.  sqlite
2c00: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
2c10: 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69  (pParse, p->nHei
2c20: 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ght);.}../*.** R
2c30: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
2c40: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2c50: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2c60: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
2c70: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
2c80: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
2c90: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
2ca0: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2cb0: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
2cc0: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
2cd0: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
2ce0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
2cf0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
2d00: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65  rn nHeight;.}.#e
2d10: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 65 78  lse.  #define ex
2d20: 70 72 53 65 74 48 65 69 67 68 74 28 79 29 0a 23  prSetHeight(y).#
2d30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d40: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
2d50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74   */../*.** Const
2d60: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
2d70: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
2d80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2d90: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
2da0: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
2db0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2dc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2dd0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
2de0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
2df0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2e00: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
2e10: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
2e20: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
2e30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
2e40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
2e60: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
2e70: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
2e80: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
2e90: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2eb0: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
2ec0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2ee0: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
2ef0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
2f10: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
2f20: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
2f30: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
2f40: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
2f50: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
2f60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
2f70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2f80: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 69  zeof(Expr));.  i
2f90: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
2fa0: 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63    /* When malloc
2fb0: 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20 70   fails, delete p
2fc0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
2fd0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61 73   Expressions pas
2fe0: 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74  sed to .    ** t
2ff0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
3000: 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f  t always be allo
3010: 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69 74  cated with sqlit
3020: 65 33 45 78 70 72 28 29 20 66 6f 72 20 74 68 69  e3Expr() for thi
3030: 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e  s .    ** reason
3040: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  . .    */.    sq
3050: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3060: 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  db, pLeft);.    
3070: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3080: 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20  e(db, pRight);. 
3090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
30a0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70  .  pNew->op = op
30b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
30c0: 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d  = pLeft;.  pNew-
30d0: 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74  >pRight = pRight
30e0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d  ;.  pNew->iAgg =
30f0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61   -1;.  pNew->spa
3100: 6e 2e 7a 20 3d 20 28 75 38 2a 29 22 22 3b 0a 20  n.z = (u8*)"";. 
3110: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
3120: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
3130: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
3140: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
3150: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3160: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
3170: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66   pLeft ){.    if
3180: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
3190: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 73 70    if( pRight->sp
31a0: 61 6e 2e 64 79 6e 3d 3d 30 20 26 26 20 70 4c 65  an.dyn==0 && pLe
31b0: 66 74 2d 3e 73 70 61 6e 2e 64 79 6e 3d 3d 30 20  ft->span.dyn==0 
31c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31d0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
31e0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
31f0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
3200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3210: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
3220: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
3230: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3240: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
3250: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
3260: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
3270: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
3280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
3290: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
32a0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
32b0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
32c0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
32d0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
32e0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
32f0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
3300: 20 7d 0a 0a 20 20 65 78 70 72 53 65 74 48 65 69   }..  exprSetHei
3310: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
3320: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3330: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
3340: 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63 65  lite3Expr() exce
3350: 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65 73  pt that it takes
3360: 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a   an extra Parse*
3370: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  .** argument and
3380: 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61 73   notifies the as
3390: 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74  sociated connect
33a0: 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61  ion object if ma
33b0: 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45  lloc fails..*/.E
33c0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
33d0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
33e0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
33f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3400: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3430: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
3440: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
3450: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
3460: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
3470: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
3480: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
3490: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
34a0: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
34b0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
34c0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
34d0: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
34e0: 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c  ->db, op, pLeft,
34f0: 20 70 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29   pRight, pToken)
3500: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
3510: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3520: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3530: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3540: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3550: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
3560: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
3570: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
3580: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
3590: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
35a0: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
35b0: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
35c0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
35d0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
35e0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
35f0: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
3600: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
3610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3620: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
3630: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
3640: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
3650: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
3660: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
3670: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
3680: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
3690: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
36a0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
36b0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
36c0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
36d0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
36e0: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
36f0: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
3700: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
3710: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
3720: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
3730: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
3740: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
3750: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3760: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
3770: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
3780: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
3790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
37a0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
37b0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
37c0: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
37d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
37e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
37f0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
3800: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
3810: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
3820: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
3830: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
3840: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
3850: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
3860: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
3870: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
3880: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
3890: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
38a0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
38b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
38c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
38d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
38e0: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
38f0: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
3900: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
3910: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
3920: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
3930: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
3940: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3950: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
3960: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
3970: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
3980: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
3990: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
39a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
39b0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
39c0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
39d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
39e0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
39f0: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
3a00: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
3a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
3a20: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
3a30: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
3a40: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
3a50: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
3a60: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
3a70: 65 6e 20 74 6f 6b 65 6e 73 2e 20 20 42 6f 74 68  en tokens.  Both
3a80: 20 74 6f 6b 65 6e 73 20 6d 75 73 74 20 62 65 20   tokens must be 
3a90: 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 74  pointing.** at t
3aa0: 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 2e 0a  he same string..
3ab0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3ac0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
3ad0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
3ae0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
3af0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
3b00: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
3b10: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
3b20: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
3b30: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
3b40: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
3b50: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
3b60: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
3b70: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
3b80: 3e 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >z);.  }.}../*.*
3b90: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
3ba0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
3bb0: 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  e for a function
3bc0: 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a   with multiple.*
3bd0: 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  * arguments..*/.
3be0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3bf0: 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20  rFunction(Parse 
3c00: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
3c10: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
3c20: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
3c30: 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65   *pNew;.  sqlite
3c40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
3c50: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  db;.  assert( pT
3c60: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
3c70: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3c80: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3c90: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
3ca0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
3cb0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3cc0: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20  ete(db, pList); 
3cd0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
3ce0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
3cf0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
3d00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3d10: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
3d20: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
3d30: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
3d40: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
3d50: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e  ->dyn==0 );.  pN
3d60: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
3d70: 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61  ken;.  pNew->spa
3d80: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
3d90: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
3da0: 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  etHeight(pParse,
3db0: 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
3dc0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
3dd0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
3de0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
3df0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
3e00: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
3e10: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
3e20: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
3e30: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
3e40: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
3e50: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
3e60: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
3e70: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
3e80: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
3e90: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
3ea0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3eb0: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
3ec0: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
3ed0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
3ee0: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
3ef0: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
3f00: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
3f10: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
3f20: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
3f30: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
3f40: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
3f50: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
3f60: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
3f70: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
3f80: 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67  "$aaa" are assig
3f90: 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ned the same num
3fa0: 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72  ber.** as the pr
3fb0: 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20  evious instance 
3fc0: 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64  of the same wild
3fd0: 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69  card.  Or if thi
3fe0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
3ff0: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
4000: 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20  e wildcard, the 
4010: 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76  next sequenial v
4020: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  ariable number i
4030: 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a  s.** assigned..*
4040: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4050: 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65  prAssignVarNumbe
4060: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
4070: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4080: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a   Token *pToken;.
4090: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
40a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
40b0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
40c0: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
40d0: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
40e0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
40f0: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
4100: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
4110: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4120: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
4130: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
4140: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
4150: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
4160: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
4170: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
4180: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4190: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
41a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
41b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
41c0: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
41d0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
41e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
41f0: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
4200: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
4210: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
4220: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
4230: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
4240: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
4250: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
4260: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
4270: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
4280: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20   testcase( i==0 
4290: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
42a0: 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 73   i==1 );.    tes
42b0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
42c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
42d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
42e0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74 65 73 74  R]-1 );.    test
42f0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
4300: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4310: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4320: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  ] );.    if( i<1
4330: 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74   || i>db->aLimit
4340: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4350: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4370: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4380: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
4390: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
43a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
43b0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
43c0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
43d0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
43e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
43f0: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
4400: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
4410: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
4420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4430: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4440: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
4450: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
4460: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
4470: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
4480: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
4490: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
44a0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
44b0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
44c0: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
44d0: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
44e0: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
44f0: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
4500: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
4510: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
4520: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4530: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
4540: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
4550: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
4560: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
4570: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
4580: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
4590: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
45a0: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
45b0: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
45c0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
45d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
45e0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
45f0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
4600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4610: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
4620: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
4630: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4640: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
4650: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
4660: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
4670: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
4680: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
4690: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
46a0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
46b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
46c0: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
46d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
46e0: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
46f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
4700: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
4710: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
4730: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
4750: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
4760: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
4770: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
4780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
4790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
47a0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
47b0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
47c0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
47d0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
47e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
47f0: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
4800: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
4810: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
4820: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
4830: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
4840: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
4850: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
4860: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
4870: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
4880: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4890: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
48a0: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
48b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
48c0: 61 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ar an expression
48d0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 6f   structure witho
48e0: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
48f0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4900: 2e 0a 2a 2a 20 53 75 62 73 74 72 75 63 74 75 72  ..** Substructur
4910: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  e is deleted..*/
4920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4930: 72 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a  rClear(sqlite3 *
4940: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
4950: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20  if( p->span.dyn 
4960: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
4970: 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  db, (char*)p->sp
4980: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
4990: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
49a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 63  te3DbFree(db, (c
49b0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
49c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
49d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65  elete(db, p->pLe
49e0: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ft);.  sqlite3Ex
49f0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
4a00: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
4a10: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4a20: 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  (db, p->pList);.
4a30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4a40: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 65  elete(db, p->pSe
4a50: 6c 65 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lect);.}../*.** 
4a60: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
4a70: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
4a80: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
4a90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4aa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
4ab0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
4ac0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
4ad0: 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 28  qlite3ExprClear(
4ae0: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
4af0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
4b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70  }../*.** The Exp
4b10: 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69  r.token field mi
4b20: 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20  ght be a string 
4b30: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
4b40: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f  quoted..** If so
4b50: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f  , remove the quo
4b60: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f  tation marks..*/
4b70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
4b80: 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74 65 33  uoteExpr(sqlite3
4b90: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a   *db, Expr *p){.
4ba0: 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
4bb0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
4bc0: 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20  equoted) ){.    
4bd0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78  return;.  }.  Ex
4be0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
4bf0: 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20   EP_Dequoted);. 
4c00: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
4c10: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  n==0 ){.    sqli
4c20: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
4c30: 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e   &p->token, &p->
4c40: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
4c50: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
4c60: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
4c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
4c80: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
4c90: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
4ca0: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
4cb0: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
4cc0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
4cd0: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
4ce0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
4cf0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
4d00: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
4d10: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
4d20: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
4d30: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
4d40: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
4d50: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
4d60: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
4d70: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
4d80: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
4d90: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
4da0: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
4db0: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
4dc0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
4dd0: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
4de0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
4df0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
4e00: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
4e10: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
4e20: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
4e30: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
4e40: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
4e50: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
4e60: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
4e70: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
4e80: 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  cated..*/.Expr *
4e90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73  sqlite3ExprDup(s
4ea0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
4eb0: 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e   *p){.  Expr *pN
4ec0: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
4ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4ee0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4ef0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4f00: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
4f10: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4f20: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
4f30: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
4f40: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
4f50: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
4f60: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
4f70: 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74  (u8*)sqlite3DbSt
4f80: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
4f90: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e  )p->token.z, p->
4fa0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e  token.n);.    pN
4fb0: 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  ew->token.dyn = 
4fc0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
4fd0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
4fe0: 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a  ken.z==0 );.  }.
4ff0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d    pNew->span.z =
5000: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66   0;.  pNew->pLef
5010: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5020: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29  up(db, p->pLeft)
5030: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
5040: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5050: 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  p(db, p->pRight)
5060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
5070: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5080: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 73  tDup(db, p->pLis
5090: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c  t);.  pNew->pSel
50a0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
50b0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  ectDup(db, p->pS
50c0: 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
50d0: 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71   pNew;.}.void sq
50e0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 73  lite3TokenCopy(s
50f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
5100: 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70  n *pTo, Token *p
5110: 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f  From){.  if( pTo
5120: 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 44  ->dyn ) sqlite3D
5130: 62 46 72 65 65 28 64 62 2c 20 28 63 68 61 72 2a  bFree(db, (char*
5140: 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20  )pTo->z);.  if( 
5150: 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  pFrom->z ){.    
5160: 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e  pTo->n = pFrom->
5170: 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  n;.    pTo->z = 
5180: 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74  (u8*)sqlite3DbSt
5190: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
51a0: 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d  )pFrom->z, pFrom
51b0: 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64  ->n);.    pTo->d
51c0: 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  yn = 1;.  }else{
51d0: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b  .    pTo->z = 0;
51e0: 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20  .  }.}.ExprList 
51f0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
5200: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5210: 20 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20   ExprList *p){. 
5220: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
5230: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
5240: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
5250: 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74  *pOldItem;.  int
5260: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
5270: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
5280: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
5290: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
52a0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
52b0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
52c0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45  rn 0;.  pNew->iE
52d0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  Cursor = 0;.  pN
52e0: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
52f0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
5300: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
5310: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33   pItem = sqlite3
5320: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
5330: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
5340: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
5350: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
5360: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5370: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
5380: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20  return 0;.  } . 
5390: 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61   pOldItem = p->a
53a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
53b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
53c0: 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b  tem++, pOldItem+
53d0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  +){.    Expr *pN
53e0: 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70  ewExpr, *pOldExp
53f0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  r;.    pItem->pE
5400: 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d  xpr = pNewExpr =
5410: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5420: 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d 20 70  db, pOldExpr = p
5430: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  OldItem->pExpr);
5440: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
5450: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
5460: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
5470: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
5480: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
5490: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
54a0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
54b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
54c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
54d0: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
54e0: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
54f0: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
5500: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
5510: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
5520: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
5530: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
5540: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
5550: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
5560: 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d 3e 73  db, &pNewExpr->s
5570: 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e  pan, &pOldExpr->
5580: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  span);.    }.   
5590: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
55a0: 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72  r==0 || pNewExpr
55b0: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20  ->span.z!=0 .   
55c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64           || pOld
55d0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a  Expr->span.z==0.
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64              || d
55f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5600: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
5610: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
5620: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
5630: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
5640: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
5650: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
5660: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
5670: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
5680: 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 70   pItem->iCol = p
5690: 4f 6c 64 49 74 65 6d 2d 3e 69 43 6f 6c 3b 0a 20  OldItem->iCol;. 
56a0: 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
56b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 41 6c   = pOldItem->iAl
56c0: 69 61 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ias;.  }.  retur
56d0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
56e0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
56f0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
5700: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
5710: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
5720: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
5730: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
5740: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
5750: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
5760: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
5770: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
5780: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
5790: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
57a0: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
57b0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
57c0: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
57d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
57e0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
57f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5800: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
5810: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5820: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
5830: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
5840: 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  cListDup(sqlite3
5850: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
5860: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
5870: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
5880: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
5890: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
58a0: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
58b0: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
58c0: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
58d0: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
58e0: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
58f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5900: 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29  cRaw(db, nByte )
5910: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
5920: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5930: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
5940: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
5950: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
5960: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
5970: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
5980: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
5990: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
59a0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
59b0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
59c0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
59d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
59e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
59f0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
5a00: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
5a10: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
5a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
5a30: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
5a40: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
5a50: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
5a60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
5a70: 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ias = sqlite3DbS
5a80: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
5a90: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
5aa0: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
5ab0: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
5ac0: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
5ad0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
5ae0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
5af0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
5b00: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
5b10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
5b20: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  ulated;.    pNew
5b30: 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73  Item->zIndex = s
5b40: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
5b50: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 49 6e  b, pOldItem->zIn
5b60: 64 65 78 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  dex);.    pNewIt
5b70: 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
5b80: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e 6f 74 49 6e   pOldItem->notIn
5b90: 64 65 78 65 64 3b 0a 20 20 20 20 70 4e 65 77 49  dexed;.    pNewI
5ba0: 74 65 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 4f  tem->pIndex = pO
5bb0: 6c 64 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3b 0a  ldItem->pIndex;.
5bc0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
5bd0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
5be0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
5bf0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
5c00: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
5c10: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
5c20: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
5c30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
5c40: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
5c50: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
5c60: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
5c70: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
5c80: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
5c90: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
5ca0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
5cb0: 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  stDup(db, pOldIt
5cc0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
5cd0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
5ce0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
5cf0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
5d00: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
5d10: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
5d20: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
5d30: 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  b, IdList *p){. 
5d40: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
5d50: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
5d60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
5d70: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
5d80: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
5d90: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
5da0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
5db0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
5dc0: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
5dd0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
5de0: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
5df0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
5e00: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
5e10: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
5e20: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
5e30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5e40: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
5e50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5e60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5e70: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
5e80: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
5e90: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
5ea0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
5eb0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
5ec0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
5ed0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
5ee0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
5ef0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
5f00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
5f10: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
5f20: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
5f30: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
5f40: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
5f50: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
5f60: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
5f70: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
5f80: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
5f90: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
5fa0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
5fb0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5fc0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  db, sizeof(*p) )
5fd0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
5fe0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
5ff0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
6000: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
6010: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
6020: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
6030: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
6040: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
6050: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
6060: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6070: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
6080: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
6090: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
60a0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
60b0: 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  upBy);.  pNew->p
60c0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
60d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
60e0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
60f0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
6100: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6110: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
6120: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
6130: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
6140: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
6150: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
6160: 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  rior);.  pNew->p
6170: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
6180: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
6190: 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  imit);.  pNew->p
61a0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
61b0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
61c0: 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d  Offset);.  pNew-
61d0: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
61e0: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
61f0: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
6200: 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
6210: 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d   & ~SF_UsesEphem
6220: 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eral;.  pNew->pR
6230: 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
6240: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
6250: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
6260: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
6270: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
6280: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
6290: 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  ] = -1;.  return
62a0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
62b0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
62c0: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
62d0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
62e0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
62f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
6300: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
6310: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
6320: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
6330: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
6340: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
6350: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
6360: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
6370: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
6380: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
6390: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
63a0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
63b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
63c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
63d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
63e0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
63f0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
6400: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
6410: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
6420: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
6430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6440: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
6450: 61 70 70 65 6e 64 65 64 20 2a 2f 0a 20 20 54 6f  appended */.  To
6460: 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20  ken *pName      
6470: 20 20 20 20 20 20 2f 2a 20 41 53 20 6b 65 79 77        /* AS keyw
6480: 6f 72 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ord for the expr
6490: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73  ession */.){.  s
64a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
64b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
64c0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
64d0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
64e0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
64f0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
6500: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
6520: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
6530: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
6540: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
6550: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
6560: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
6570: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
6580: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6590: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
65a0: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
65b0: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
65c0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
65d0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a  db, pList->a, n*
65e0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
65f0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  0]));.    if( a=
6600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
6610: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
6620: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
6630: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
6640: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
6650: 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 61 29 2f  llocSize(db, a)/
6660: 73 69 7a 65 6f 66 28 61 5b 30 5d 29 3b 0a 20 20  sizeof(a[0]);.  
6670: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
6680: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
6690: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
66a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
66b0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
66c0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
66d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
66e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
66f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
6700: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
6710: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
6720: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6730: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  , pName);.    pI
6740: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
6750: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  pr;.    pItem->i
6760: 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alias = 0;.  }. 
6770: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
6780: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
6790: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
67a0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
67b0: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
67c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
67d0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
67e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
67f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
6800: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
6810: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
6820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
6830: 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  pEList contains 
6840: 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74  more than iLimit
6850: 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65   elements,.** le
6860: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6870: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
6880: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
6890: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
68a0: 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  th(.  Parse *pPa
68b0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
68c0: 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74  *pEList,.  const
68d0: 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29   char *zObject.)
68e0: 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61  {.  int mx = pPa
68f0: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
6900: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
6910: 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  UMN];.  testcase
6920: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
6930: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b  st->nExpr==mx );
6940: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c  .  testcase( pEL
6950: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
6960: 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20  Expr==mx+1 );.  
6970: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
6980: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29  List->nExpr>mx )
6990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
69a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
69b0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
69c0: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
69d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
69e0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
69f0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
6a00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6a10: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 73  ExprListDelete(s
6a20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
6a30: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
6a40: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
6a50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6a60: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
6a70: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
6a80: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
6a90: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
6aa0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
6ab0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
6ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
6ad0: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
6ae0: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
6af0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
6b00: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
6b10: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
6b20: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
6b30: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
6b40: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
6b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6b60: 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
6b70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
6b80: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
6b90: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
6ba0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
6bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
6bc0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
6bd0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
6be0: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
6bf0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
6c00: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
6c10: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
6c20: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
6c30: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
6c40: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
6c50: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
6c60: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
6c70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6c80: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
6c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
6ca0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
6cb0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
6cc0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
6cd0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
6ce0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
6cf0: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
6d00: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6d10: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
6d20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
6d30: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
6d40: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
6d50: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
6d60: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
6d70: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
6d80: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
6d90: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
6da0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
6db0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
6dc0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
6dd0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
6de0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
6df0: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
6e00: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
6e10: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
6e20: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
6e30: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
6e40: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
6e50: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 41  i==3 && ExprHasA
6e60: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
6e70: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
6e80: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75  {.    pWalker->u
6e90: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  .i = 0;.    retu
6ea0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
6eb0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
6ec0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
6ed0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
6ee0: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
6ef0: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
6f00: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
6f10: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
6f20: 64 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d  d pWalker->u.i==
6f30: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
6f40: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
6f50: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
6f60: 69 3d 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b  i==2 ) return 0;
6f70: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
6f80: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61  hrough */.    ca
6f90: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
6fa0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
6fb0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
6fc0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
6fd0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
6fe0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
6ff0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7000: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
7010: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
7020: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
7030: 49 53 54 53 3a 0a 20 20 20 20 20 20 74 65 73 74  ISTS:.      test
7040: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7050: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
7060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7070: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
7080: 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  TS );.#endif.   
7090: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
70a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
70b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
70c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
70d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
70e0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
70f0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20  op==TK_DOT );.  
7100: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7110: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
7120: 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
7130: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
7140: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
7150: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 70 57  LUMN );.      pW
7160: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
7170: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
7180: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 64 65 66 61  _Abort;.    defa
7190: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
71a0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
71b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
71c0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
71d0: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
71e0: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
71f0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
7200: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
7210: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
7220: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 72 65 74 75  >u.i = 0;.  retu
7230: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a  rn WRC_Abort;.}.
7240: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 49  static int exprI
7250: 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20  sConst(Expr *p, 
7260: 69 6e 74 20 69 6e 69 74 46 6c 61 67 29 7b 0a 20  int initFlag){. 
7270: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 75   Walker w;.  w.u
7280: 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20  .i = initFlag;. 
7290: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
72a0: 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e   = exprNodeIsCon
72b0: 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65  stant;.  w.xSele
72c0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
72d0: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
72e0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  t;.  sqlite3Walk
72f0: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
7300: 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a 7d 0a 0a  eturn w.u.i;.}..
7310: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
7320: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
7330: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
7340: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
7350: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
7360: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
7370: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
7380: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
7390: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
73a0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
73b0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
73c0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
73d0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
73e0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
73f0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
7400: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
7410: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
7420: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
7430: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
7440: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
7450: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
7460: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 29 3b 0a  rIsConst(p, 1);.
7470: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
7480: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
7490: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
74a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
74b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
74c0: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
74d0: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
74e0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
74f0: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
7500: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
7510: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
7520: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
7530: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
7540: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
7550: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
7560: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
7570: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
7580: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
7590: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
75a0: 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   3);.}../*.** Wa
75b0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
75c0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
75d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
75e0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
75f0: 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  * or a function 
7600: 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61  call with consta
7610: 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
7620: 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74  eturn and 0 if t
7630: 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20  here.** are any 
7640: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
7650: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
7660: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7670: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
7680: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
7690: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
76a0: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
76b0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
76c0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
76d0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
76e0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
76f0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
7700: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
7710: 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  on(Expr *p){.  r
7720: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
7730: 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(p, 2);.}../*.*
7740: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
7750: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
7760: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
7770: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
7780: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
7790: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
77a0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
77b0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
77c0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
77d0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
77e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
77f0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
7800: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
7810: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
7820: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
7830: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
7840: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
7850: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
7860: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7870: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
7880: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
7890: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
78a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
78b0: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
78c0: 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20  {.    *pValue = 
78d0: 70 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 72  p->iTable;.    r
78e0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73  eturn 1;.  }.  s
78f0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
7900: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
7910: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  GER: {.      rc 
7920: 3d 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  = sqlite3GetInt3
7930: 32 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  2((char*)p->toke
7940: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  n.z, pValue);.  
7950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7960: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
7970: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  US: {.      rc =
7980: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7990: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
79a0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  pValue);.      b
79b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
79c0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
79d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
79e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
79f0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
7a00: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
7a10: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
7a20: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
7a30: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7a50: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
7a60: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ak;.  }.  if( rc
7a70: 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20   ){.    p->op = 
7a80: 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
7a90: 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  p->flags |= EP_I
7aa0: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 70 2d 3e  ntValue;.    p->
7ab0: 69 54 61 62 6c 65 20 3d 20 2a 70 56 61 6c 75 65  iTable = *pValue
7ac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7ad0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
7ae0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
7af0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
7b00: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
7b10: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
7b20: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
7b30: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
7b40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7b50: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
7b60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7b70: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7b80: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
7b90: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7ba0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7bb0: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
7bc0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
7bd0: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
7be0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
7bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  nt sqlite3_enabl
7c00: 65 5f 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65  e_in_opt = 1;.#e
7c10: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 73 71  lse.  #define sq
7c20: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
7c30: 6f 70 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  opt 1.#endif../*
7c40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7c50: 69 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  if the IN operat
7c60: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
7c70: 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a  is enabled and.*
7c80: 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  * the SELECT sta
7c90: 74 65 6d 65 6e 74 20 70 20 65 78 69 73 74 73 20  tement p exists 
7ca0: 61 6e 64 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a  and is of the.**
7cb0: 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a   simple form:.**
7cc0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c  .**     SELECT <
7cd0: 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61  column> FROM <ta
7ce0: 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble>.**.** If th
7cf0: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
7d00: 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
7d10: 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69  le to use an exi
7d20: 73 74 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f  sting table.** o
7d30: 72 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  r index instead 
7d40: 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e  of generating an
7d50: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
7d60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
7d70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7d80: 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 43  Y.static int isC
7d90: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
7da0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
7db0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
7dc0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7dd0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
7de0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f  .  if( !sqlite3_
7df0: 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 29 20  enable_in_opt ) 
7e00: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 4e 20  return 0; /* IN 
7e10: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73  optimization mus
7e20: 74 20 62 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  t be enabled */.
7e30: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
7e40: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
7e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68           /* righ
7e60: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
7e70: 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  N is SELECT */. 
7e80: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
7e90: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61          /* Not a
7eb0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
7ec0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
7ed0: 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
7ee0: 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
7ef0: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
7f00: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
7f10: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
7f20: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
7f30: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
7f40: 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
7f50: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
7f60: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
7f70: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
7f80: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
7f90: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fb0: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
7fc0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
7fd0: 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
7fe0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57  n 0;.  if( p->pW
7ff0: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8010: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
8020: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
8030: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
8040: 70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSrc==0 ) return
8050: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8060: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
8070: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
8080: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
8090: 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
80a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
80b0: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
80c0: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
80d0: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
80e0: 73 65 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71  se is not a subq
80f0: 75 65 72 79 20 2a 2f 0a 20 20 70 54 61 62 20 3d  uery */.  pTab =
8100: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62   pSrc->a[0].pTab
8110: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8120: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
8130: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8140: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
8150: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
8160: 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  use is not a vie
8170: 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  w */.  if( IsVir
8180: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
8190: 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
81a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f 74   FROM clause not
81b0: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
81c0: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
81d0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
81e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
81f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
8200: 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d 6e     /* One column
8210: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8220: 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c 69  et */.  if( pELi
8230: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
8240: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
8250: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
8260: 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ult is a column 
8270: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
8280: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8290: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
82a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
82b0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
82c0: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
82d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
82e0: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
82f0: 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20 74  ** It's job is t
8300: 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65  o find or create
8310: 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
8320: 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65 20  ure that may be 
8330: 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20 74  used.** either t
8340: 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65  o test for membe
8350: 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e 2e  rship of the (..
8360: 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  .) set or to ite
8370: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
8380: 69 74 73 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69  its members, ski
8390: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
83a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ..**.** The curs
83b0: 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  or opened on the
83c0: 20 73 74 72 75 63 74 75 72 65 20 28 64 61 74 61   structure (data
83d0: 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61 74 61  base table, data
83e0: 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a 20 6f  base index .** o
83f0: 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62 6c 65  r ephermal table
8400: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
8410: 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f 72 65  X->iTable before
8420: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
8430: 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65 20 72  eturns..** The r
8440: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 6e  eturned value in
8450: 64 69 63 61 74 65 73 20 74 68 65 20 73 74 72 75  dicates the stru
8460: 63 74 75 72 65 20 74 79 70 65 2c 20 61 73 20 66  cture type, as f
8470: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
8480: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 2d  IN_INDEX_ROWID -
8490: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
84a0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
84b0: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
84c0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 20   IN_INDEX_INDEX 
84d0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
84e0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74   opened on a dat
84f0: 61 62 61 73 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  abase index..** 
8500: 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 2d    IN_INDEX_EPH -
8510: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 77 61     The cursor wa
8520: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70  s opened on a sp
8530: 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  ecially created 
8540: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
8550: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
8560: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
8570: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ble..**.** An ex
8580: 69 73 74 69 6e 67 20 73 74 72 75 63 74 75 72 65  isting structure
8590: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
85a0: 64 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  d if the SELECT 
85b0: 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  is of the simple
85c0: 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  .** form:.**.** 
85d0: 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75      SELECT <colu
85e0: 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e  mn> FROM <table>
85f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 72 4e 6f 74 46  .**.** If prNotF
8600: 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  ound parameter i
8610: 73 20 30 2c 20 74 68 65 6e 20 74 68 65 20 73 74  s 0, then the st
8620: 72 75 63 74 75 72 65 20 77 69 6c 6c 20 62 65 20  ructure will be 
8630: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 0a  used to iterate.
8640: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ** through the s
8650: 65 74 20 6d 65 6d 62 65 72 73 2c 20 73 6b 69 70  et members, skip
8660: 70 69 6e 67 20 61 6e 79 20 64 75 70 6c 69 63 61  ping any duplica
8670: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
8680: 65 20 61 6e 0a 2a 2a 20 65 70 68 65 72 65 6d 61  e an.** epherema
8690: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
86a0: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
86b0: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
86c0: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
86d0: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
86e0: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
86f0: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
8700: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
8710: 20 69 74 0a 2a 2a 20 69 73 20 75 6e 69 71 75 65   it.** is unique
8720: 20 62 79 20 76 69 72 74 75 65 20 6f 66 20 61 20   by virtue of a 
8730: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 69 6d  constraint or im
8740: 70 6c 69 63 69 74 20 69 6e 64 65 78 2e 0a 2a 2a  plicit index..**
8750: 0a 2a 2a 20 49 66 20 74 68 65 20 70 72 4e 6f 74  .** If the prNot
8760: 46 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  Found parameter 
8770: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 74  is not 0, then t
8780: 68 65 20 73 74 72 75 63 74 75 72 65 20 77 69 6c  he structure wil
8790: 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  l be used .** fo
87a0: 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d 62 65  r fast set membe
87b0: 72 73 68 69 70 20 74 65 73 74 73 2e 20 49 6e 20  rship tests. In 
87c0: 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 70 68  this case an eph
87d0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
87e0: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
87f0: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
8800: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
8810: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
8820: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
8830: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
8840: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
8850: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
8860: 2a 20 57 68 65 6e 20 74 68 65 20 73 74 72 75 63  * When the struc
8870: 74 75 72 65 20 69 73 20 62 65 69 6e 67 20 75 73  ture is being us
8880: 65 64 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65  ed for set membe
8890: 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68 65  rship tests, the
88a0: 20 75 73 65 72 0a 2a 2a 20 6e 65 65 64 73 20 74   user.** needs t
88b0: 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  o know whether o
88c0: 72 20 6e 6f 74 20 74 68 65 20 73 74 72 75 63 74  r not the struct
88d0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ure contains an 
88e0: 53 51 4c 20 4e 55 4c 4c 20 0a 2a 2a 20 76 61 6c  SQL NULL .** val
88f0: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ue in order to c
8900: 6f 72 72 65 63 74 6c 79 20 65 76 61 6c 75 61 74  orrectly evaluat
8910: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 69  e expressions li
8920: 6b 65 20 22 58 20 49 4e 20 28 59 2c 20 5a 29 22  ke "X IN (Y, Z)"
8930: 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
8940: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
8950: 68 65 20 73 74 72 75 63 74 75 72 65 20 6d 61 79  he structure may
8960: 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
8970: 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74  value at.** runt
8980: 69 6d 65 2c 20 74 68 65 6e 20 61 20 72 65 67 69  ime, then a regi
8990: 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ster is allocate
89a0: 64 20 61 6e 64 20 74 68 65 20 72 65 67 69 73 74  d and the regist
89b0: 65 72 20 6e 75 6d 62 65 72 20 77 72 69 74 74 65  er number writte
89c0: 6e 0a 2a 2a 20 74 6f 20 2a 70 72 4e 6f 74 46 6f  n.** to *prNotFo
89d0: 75 6e 64 2e 20 49 66 20 74 68 65 72 65 20 69 73  und. If there is
89e0: 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
89f0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
8a00: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c 4c  ntains a.** NULL
8a10: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 72   value, then *pr
8a20: 4e 6f 74 46 6f 75 6e 64 20 69 73 20 6c 65 66 74  NotFound is left
8a30: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
8a40: 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
8a50: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
8a60: 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74   its location st
8a70: 6f 72 65 64 20 69 6e 20 2a 70 72 4e 6f 74 46 6f  ored in *prNotFo
8a80: 75 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 73  und, then.** its
8a90: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 69   initial value i
8aa0: 73 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  s NULL. If the s
8ab0: 74 72 75 63 74 75 72 65 20 64 6f 65 73 20 6e 6f  tructure does no
8ac0: 74 20 72 65 6d 61 69 6e 20 63 6f 6e 73 74 61 6e  t remain constan
8ad0: 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 75 72  t.** for the dur
8ae0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 65  ation of the que
8af0: 72 79 20 28 69 2e 65 2e 20 74 68 65 20 73 65 74  ry (i.e. the set
8b00: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
8b10: 20 73 75 62 2d 73 65 6c 65 63 74 29 2c 20 0a 2a   sub-select), .*
8b20: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
8b30: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 72 65 67  he allocated reg
8b40: 69 73 74 65 72 20 69 73 20 72 65 73 65 74 20 74  ister is reset t
8b50: 6f 20 4e 55 4c 4c 20 65 61 63 68 20 74 69 6d 65  o NULL each time
8b60: 20 74 68 65 20 0a 2a 2a 20 73 74 72 75 63 74 75   the .** structu
8b70: 72 65 20 69 73 20 72 65 70 6f 70 75 6c 61 74 65  re is repopulate
8b80: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
8b90: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75 73 65  he caller to use
8ba0: 20 76 64 62 65 20 63 6f 64 65 20 0a 2a 2a 20 65   vdbe code .** e
8bb0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
8bc0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
8bd0: 2a 20 20 20 69 66 28 20 72 65 67 69 73 74 65 72  *   if( register
8be0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 2a 2a 20 20 20 20  ==NULL ){.**    
8bf0: 20 68 61 73 5f 6e 75 6c 6c 20 3d 20 3c 74 65 73   has_null = <tes
8c00: 74 20 69 66 20 64 61 74 61 20 73 74 72 75 63 74  t if data struct
8c10: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6e 75 6c  ure contains nul
8c20: 6c 3e 0a 2a 2a 20 20 20 20 20 72 65 67 69 73 74  l>.**     regist
8c30: 65 72 20 3d 20 31 0a 2a 2a 20 20 20 7d 0a 2a 2a  er = 1.**   }.**
8c40: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
8c50: 61 76 6f 69 64 20 72 75 6e 6e 69 6e 67 20 74 68  avoid running th
8c60: 65 20 3c 74 65 73 74 20 69 66 20 64 61 74 61 20  e <test if data 
8c70: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
8c80: 6e 73 20 6e 75 6c 6c 3e 0a 2a 2a 20 74 65 73 74  ns null>.** test
8c90: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
8ca0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   is necessary..*
8cb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8cc0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
8cd0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
8ce0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
8cf0: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 69  rse, Expr *pX, i
8d00: 6e 74 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 29 7b  nt *prNotFound){
8d10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20 20  .  Select *p;.  
8d20: 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 0a 20  int eType = 0;. 
8d30: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
8d40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e  se->nTab++;.  in
8d50: 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d  t mustBeUnique =
8d60: 20 21 70 72 4e 6f 74 46 6f 75 6e 64 3b 0a 0a 20   !prNotFound;.. 
8d70: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 77 69 6e 67   /* The follwing
8d80: 20 69 66 28 2e 2e 2e 29 20 65 78 70 72 65 73 73   if(...) express
8d90: 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ion is true if t
8da0: 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
8db0: 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
8dc0: 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
8dd0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
8de0: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
8df0: 3e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  >.  **.  ** If t
8e00: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
8e10: 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
8e20: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 20 65 78  ble to use an ex
8e30: 69 73 74 69 6e 67 20 74 61 62 6c 65 0a 20 20 2a  isting table.  *
8e40: 2a 20 6f 72 20 69 6e 64 65 78 20 69 6e 73 74 65  * or index inste
8e50: 61 64 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67  ad of generating
8e60: 20 61 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   an epheremal ta
8e70: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ble..  */.  p = 
8e80: 70 58 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 69  pX->pSelect;.  i
8e90: 66 28 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  f( isCandidateFo
8ea0: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
8eb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8ec0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49  Parse->db;.    I
8ed0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
8ee0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d  Expr *pExpr = p-
8ef0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
8f00: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
8f10: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
8f20: 6d 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  mn;.    Vdbe *v 
8f30: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8f40: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f  (pParse);..    /
8f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
8f60: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
8f70: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
8f80: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
8f90: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
8fa0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
8fb0: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
8fc0: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
8fd0: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
8fe0: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
8ff0: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
9000: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
9010: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
9020: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
9030: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9040: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b        int iAddr;
9050: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
9060: 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
9070: 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  0].pTab;.      i
9080: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
9090: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
90a0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
90b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
90c0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
90d0: 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 69 41 64  iDb);..      iAd
90e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
90f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
9100: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
9110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9120: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
9130: 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20  , iMem);..      
9140: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
9150: 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
9160: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
9170: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
9180: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
9190: 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
91a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
91b0: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
91c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
91d0: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
91e0: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
91f0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
9200: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
9210: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73   .      ** be us
9220: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
9230: 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20   temp-table, it 
9240: 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20  must be ordered 
9250: 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20  according.      
9260: 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61  ** to this colla
9270: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20  tion sequence.. 
9280: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f       */.      Co
9290: 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71  llSeq *pReq = sq
92a0: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
92b0: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
92c0: 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78  , pX->pLeft, pEx
92d0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  pr);..      /* C
92e0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66  heck that the af
92f0: 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c  finity that will
9300: 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66   be used to perf
9310: 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a  orm the .      *
9320: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
9330: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
9340: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
9350: 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
9360: 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   ** it is not, i
9370: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
9380: 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64  e to use any ind
9390: 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ex..      */.   
93a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
93b0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
93c0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
93d0: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
93e0: 41 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20  Affinity(pX);.  
93f0: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
9400: 5f 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f  _ok = (pTab->aCo
9410: 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79  l[iCol].affinity
9420: 3d 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49  ==aff||aff==SQLI
9430: 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20  TE_AFF_NONE);.. 
9440: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
9450: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
9460: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
9470: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
9480: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
9490: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
94a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
94b0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
94c0: 26 20 28 70 52 65 71 3d 3d 73 71 6c 69 74 65 33  & (pReq==sqlite3
94d0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
94e0: 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61  ENC(db), pIdx->a
94f0: 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29  zColl[0], -1, 0)
9500: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21  ).         && (!
9510: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20  mustBeUnique || 
9520: 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
9530: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  1 && pIdx->onErr
9540: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20  or!=OE_None)).  
9550: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
9560: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
9570: 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
9580: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
9590: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
95a0: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Addr;.          
95b0: 63 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20  char *pKey;.  . 
95c0: 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20           pKey = 
95d0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49  (char *)sqlite3I
95e0: 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72  ndexKeyinfo(pPar
95f0: 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  se, pIdx);.     
9600: 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
9610: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
9620: 64 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  db, pIdx->pSchem
9630: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  a);.          sq
9640: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
9650: 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20  ee(v, iDb);..   
9660: 20 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73         iAddr = s
9670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
9680: 28 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29  (v, OP_If, iMem)
9690: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
96a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
96b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
96c0: 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20 20 20 20  iMem);.  .      
96d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
96e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
96f0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70 49  umColumns, 0, pI
9700: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
9710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9720: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9730: 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
9740: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c  pIdx->tnum, iDb,
9750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 70 4b 65 79 2c 50 34 5f 4b 45 59 49 4e 46 4f 5f  pKey,P4_KEYINFO_
9780: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
9790: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
97a0: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
97b0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
97c0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
97d0: 44 45 58 5f 49 4e 44 45 58 3b 0a 0a 20 20 20 20  DEX_INDEX;..    
97e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
97f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
9800: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
9810: 66 28 20 70 72 4e 6f 74 46 6f 75 6e 64 20 26 26  f( prNotFound &&
9820: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
9830: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l].notNull ){.  
9840: 20 20 20 20 20 20 20 20 20 20 2a 70 72 4e 6f 74            *prNot
9850: 46 6f 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  Found = ++pParse
9860: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
9870: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9890: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
98a0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48  ){.    int rMayH
98b0: 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  aveNull = 0;.   
98c0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
98d0: 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 70  X_EPH;.    if( p
98e0: 72 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20  rNotFound ){.   
98f0: 20 20 20 2a 70 72 4e 6f 74 46 6f 75 6e 64 20 3d     *prNotFound =
9900: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
9910: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
9920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58      }else if( pX
9930: 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  ->pLeft->iColumn
9940: 3c 30 20 26 26 20 70 58 2d 3e 70 53 65 6c 65 63  <0 && pX->pSelec
9950: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 54  t==0 ){.      eT
9960: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
9970: 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OWID;.    }.    
9980: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
9990: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
99a0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
99b0: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
99c0: 4f 57 49 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OWID);.  }else{.
99d0: 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d      pX->iTable =
99e0: 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74   iTab;.  }.  ret
99f0: 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e  urn eType;.}.#en
9a00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
9a10: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61  ate code for sca
9a20: 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75  lar subqueries u
9a30: 73 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73  sed as an expres
9a40: 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f  sion.** and IN o
9a50: 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70  perators.  Examp
9a60: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  les:.**.**     (
9a70: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
9a80: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62            -- sub
9a90: 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49  query.**     EXI
9aa0: 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52  STS (SELECT a FR
9ab0: 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54  OM b)   -- EXIST
9ac0: 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  S subquery.**   
9ad0: 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20    x IN (4,5,11) 
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
9af0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
9b00: 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68   list on right-h
9b10: 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20  and side.**     
9b20: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  x IN (SELECT a F
9b30: 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e  ROM b)     -- IN
9b40: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73   operator with s
9b50: 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72  ubquery on the r
9b60: 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ight.**.** The p
9b70: 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64  Expr parameter d
9b80: 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70  escribes the exp
9b90: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
9ba0: 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20  tains the IN.** 
9bb0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71  operator or subq
9bc0: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  uery..**.** If p
9bd0: 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64  arameter isRowid
9be0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
9bf0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  en expression pE
9c00: 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  xpr is guarantee
9c10: 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68  d.** to be of th
9c20: 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20  e form "<rowid> 
9c30: 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77  IN (?, ?, ?)", w
9c40: 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20  here <rowid> is 
9c50: 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74  a reference.** t
9c60: 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b  o some integer k
9c70: 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74  ey column of a t
9c80: 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20  able B-Tree. In 
9c90: 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20 61  this case, use a
9ca0: 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72  n.** intkey B-Tr
9cb0: 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ee to store the 
9cc0: 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76  set of IN(...) v
9cd0: 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66  alues instead of
9ce0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73   the usual.** (s
9cf0: 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65 20  lower) variable 
9d00: 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72  length keys B-Tr
9d10: 65 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ee..*/.#ifndef S
9d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9d30: 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ERY.void sqlite3
9d40: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20  CodeSubselect(. 
9d50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9d60: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
9d70: 0a 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e  .  int rMayHaveN
9d80: 75 6c 6c 2c 0a 20 20 69 6e 74 20 69 73 52 6f 77  ull,.  int isRow
9d90: 69 64 0a 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  id.){.  int test
9da0: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Addr = 0;       
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
9dd0: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64   address */.  Vd
9de0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9df0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9e00: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
9e10: 75 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73  urn;...  /* This
9e20: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
9e30: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
9e40: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
9e50: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
9e60: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
9e70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
9e80: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
9e90: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
9ea0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
9eb0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
9ec0: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
9ed0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9ee0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
9ef0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
9f00: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
9f10: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
9f20: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
9f30: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
9f40: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
9f50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
9f60: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
9f70: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
9f80: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
9f90: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
9fa0: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
9fb0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
9fc0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
9fd0: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
9fe0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9ff0: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
a000: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
a010: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
a020: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
a030: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
a040: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
a050: 66 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73  f, mem);.    tes
a060: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
a070: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a080: 49 6e 74 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29  Integer, 1, mem)
a090: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65  ;.    assert( te
a0a0: 73 74 41 64 64 72 3e 30 20 7c 7c 20 70 50 61 72  stAddr>0 || pPar
a0b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a0c0: 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  iled );.  }..  s
a0d0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a0e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a0f0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
a100: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
a110: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
a120: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
a130: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
a140: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
a150: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
a160: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
a170: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
a180: 2d 3e 70 4c 65 66 74 3b 0a 0a 20 20 20 20 20 20  ->pLeft;..      
a190: 69 66 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  if( rMayHaveNull
a1a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a1b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a1c0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 4d 61   OP_Null, 0, rMa
a1d0: 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  yHaveNull);.    
a1e0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 66 66 69 6e    }..      affin
a1f0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
a200: 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29  rAffinity(pLeft)
a210: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
a220: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
a230: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
a240: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
a250: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
a260: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
a270: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
a280: 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74  same way. A virt
a290: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ual table is .  
a2a0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
a2b0: 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
a2c0: 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
a2d0: 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
a2e0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
a2f0: 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
a300: 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
a310: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
a320: 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
a330: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
a340: 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
a350: 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
a360: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
a370: 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
a380: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
a390: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
a3a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
a3b0: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
a3c0: 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
a3d0: 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
a3e0: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
a3f0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
a400: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
a410: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
a420: 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
a430: 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
a440: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
a450: 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
a460: 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
a470: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
a480: 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
a490: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
a4a0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
a4b0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
a4c0: 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
a4d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a4e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
a4f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a500: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
a510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a520: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
a530: 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
a540: 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20  le, !isRowid);. 
a550: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
a560: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
a570: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
a580: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
a590: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
a5a0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
a5b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
a5c0: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
a5d0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
a5e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
a5f0: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
a600: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
a610: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
a620: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
a630: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
a640: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
a650: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
a660: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
a670: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
a680: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
a690: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a6a0: 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
a6b0: 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
a6c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
a6d0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
a6e0: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
a6f0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
a700: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e        dest.affin
a710: 69 74 79 20 3d 20 28 69 6e 74 29 61 66 66 69 6e  ity = (int)affin
a720: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
a730: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
a740: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
a750: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
a760: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
a770: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a780: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
a790: 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
a7a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
a7b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7c0: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
a7d0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
a7e0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
a7f0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a800: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
a810: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
a820: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
a830: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
a840: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
a850: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
a860: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
a870: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
a880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a890: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
a8a0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
a8b0: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
a8c0: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
a8d0: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
a8e0: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
a8f0: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
a900: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
a910: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
a920: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
a930: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
a940: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
a950: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
a960: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
a970: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
a980: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
a990: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
a9a0: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
a9b0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
a9c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
a9d0: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
a9e0: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
a9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
aa00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
aa10: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
aa20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
aa30: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
aa40: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
aa50: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
aa60: 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
aa70: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
aa80: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
aa90: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
aaa0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79     }.        key
aac0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
aad0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
aae0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
aaf0: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
ab00: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
ab10: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
ab20: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
ab30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20  . */.        r1 
ab40: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ab50: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
ab60: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
ab70: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ab80: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
ab90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aba0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
abb0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
abc0: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
abd0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
abe0: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
abf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
ac00: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
ac10: 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20  pExpr;..        
ac20: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
ac30: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
ac40: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
ac50: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
ac60: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
ac70: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
ac80: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
ac90: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
aca0: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
acb0: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
acc0: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
acd0: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
ace0: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
acf0: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
ad00: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
ad10: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
ad20: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
ad30: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
ad40: 66 28 20 74 65 73 74 41 64 64 72 20 26 26 20 21  f( testAddr && !
ad50: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
ad60: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
ad70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ad80: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
ad90: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
ada0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   2);.           
adb0: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
adc0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
add0: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
ade0: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
adf0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
ae00: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
ae10: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
ae20: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
ae30: 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
ae40: 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
ae50: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
ae60: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29  pParse, pE2, r1)
ae70: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
ae80: 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
ae90: 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
aea0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
aeb0: 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
aec0: 68 65 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 20  he--;..         
aed0: 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aef0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
af00: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
af10: 33 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  3, sqlite3VdbeCu
af20: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
af30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
af40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
af50: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78  , OP_Insert, pEx
af60: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20  pr->iTable, r2, 
af70: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r3);.          }
af80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
af90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afa0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
afb0: 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c  cord, r3, 1, r2,
afc0: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
afe0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
aff0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
b000: 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
b010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b020: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b030: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
b040: 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
b050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b060: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
b070: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b080: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
b090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
b0a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b0b0: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
b0c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 52  }.      if( !isR
b0d0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
b0e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b0f0: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
b100: 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50  id *)&keyInfo, P
b110: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
b120: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
b140: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
b150: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
b160: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
b170: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
b180: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
b190: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
b1a0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
b1b0: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
b1c0: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
b1d0: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
b1e0: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
b1f0: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
b200: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
b210: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b220: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f   static const To
b230: 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a  ken one = { (u8*
b240: 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20  )"1", 0, 1 };.  
b250: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
b260: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
b270: 73 74 20 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  st dest;..      
b280: 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53  pSel = pExpr->pS
b290: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
b2a0: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
b2b0: 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
b2c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
b2d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
b2e0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
b2f0: 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
b300: 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
b310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b320: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b330: 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72  ll, 0, dest.iPar
b340: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
b350: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
b360: 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  t subquery resul
b370: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  t"));.      }els
b380: 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  e{.        dest.
b390: 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73  eDest = SRT_Exis
b3a0: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
b3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b3c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
b3d0: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
b3e0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b3f0: 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
b400: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
b410: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b420: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
b430: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
b440: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
b450: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
b460: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b470: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
b480: 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20   0, &one);.     
b490: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
b4a0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
b4b0: 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20   &dest) ){.     
b4c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
b4d0: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
b4e0: 69 43 6f 6c 75 6d 6e 20 3d 20 64 65 73 74 2e 69  iColumn = dest.i
b4f0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  Parm;.      brea
b500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
b510: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
b520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b530: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
b540: 64 64 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72  ddr-1);.  }..  r
b550: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
b560: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
b570: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
b580: 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38  * Duplicate an 8
b590: 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73  -byte value.*/.s
b5a0: 74 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38  tatic char *dup8
b5b0: 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63  bytes(Vdbe *v, c
b5c0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a  onst char *in){.
b5d0: 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71    char *out = sq
b5e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b5f0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
b600: 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74  ), 8);.  if( out
b610: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f   ){.    memcpy(o
b620: 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a  ut, in, 8);.  }.
b630: 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a    return out;.}.
b640: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b650: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
b660: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
b670: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
b680: 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
b690: 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
b6a0: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
b6b0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
b6c0: 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
b6d0: 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
b6e0: 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
b6f0: 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
b700: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
b710: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
b720: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
b730: 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
b740: 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
b750: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
b760: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b770: 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
b780: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
b790: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 6e  *z, int n, int n
b7a0: 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
b7b0: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
b7c0: 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c  z || v==0 || sql
b7d0: 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d  ite3VdbeDb(v)->m
b7e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b7f0: 20 61 73 73 65 72 74 28 20 21 7a 20 7c 7c 20 21   assert( !z || !
b800: 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b  isdigit(z[n]) );
b810: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
b820: 54 45 52 28 6e 29 3b 0a 20 20 69 66 28 20 7a 20  TER(n);.  if( z 
b830: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
b840: 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
b850: 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  V;.    sqlite3At
b860: 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20  oF(z, &value);. 
b870: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
b880: 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20 20  NaN(value) ){.  
b890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b8a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b8b0: 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  , 0, iMem);.    
b8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
b8d0: 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
b8e0: 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
b8f0: 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
b900: 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
b910: 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
b920: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
b930: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
b940: 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
b950: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  L);.    }.  }.}.
b960: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b970: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
b980: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
b990: 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
b9a0: 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
b9b0: 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
b9c0: 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
b9d0: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
b9e0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
b9f0: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
ba00: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
ba10: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
ba20: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
ba30: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
ba40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
ba50: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
ba60: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
ba70: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
ba80: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
ba90: 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20  nteger(Vdbe *v, 
baa0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
bab0: 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
bac0: 65 6d 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  em){.  const cha
bad0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 70 45 78 70  r *z;.  if( pExp
bae0: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
baf0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
bb00: 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  t i = pExpr->iTa
bb10: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 6e 65 67  ble;.    if( neg
bb20: 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
bb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bb40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
bb50: 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20  er, i, iMem);.  
bb60: 7d 65 6c 73 65 20 69 66 28 20 28 7a 20 3d 20 28  }else if( (z = (
bb70: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
bb80: 65 6e 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20  en.z)!=0 ){.    
bb90: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
bba0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
bbb0: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  n;.    assert( !
bbc0: 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b  isdigit(z[n]) );
bbd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
bbe0: 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20  GetInt32(z, &i) 
bbf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  ){.      if( neg
bc00: 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20  Flag ) i = -i;. 
bc10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bc30: 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
bc40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
bc50: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
bc60: 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29 7b  s(z, negFlag) ){
bc70: 0a 20 20 20 20 20 20 69 36 34 20 76 61 6c 75 65  .      i64 value
bc80: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
bc90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  ;.      sqlite3A
bca0: 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65 29  toi64(z, &value)
bcb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46  ;.      if( negF
bcc0: 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76  lag ) value = -v
bcd0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20 3d  alue;.      zV =
bce0: 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
bcf0: 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
bd00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bd10: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36  ddOp4(v, OP_Int6
bd20: 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  4, 0, iMem, 0, z
bd30: 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  V, P4_INT64);.  
bd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
bd50: 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 2c  odeReal(v, z, n,
bd60: 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
bd70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
bd80: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
bd90: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  de that will ext
bda0: 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e  ract the iColumn
bdb0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a  -th column from.
bdc0: 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  ** table pTab an
bdd0: 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  d store the colu
bde0: 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65  mn value in a re
bdf0: 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66 6f  gister.  An effo
be00: 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  rt.** is made to
be10: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
be20: 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  n value in regis
be30: 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74 68  ter iReg, but th
be40: 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75 61  is is.** not gua
be50: 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c 6f  ranteed.  The lo
be60: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  cation of the co
be70: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72 65  lumn value is re
be80: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
be90: 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
bea0: 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
beb0: 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65  ab in iTable whe
bec0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
bed0: 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66  * is called.  If
bee0: 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20   iColumn<0 then 
bef0: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
bf00: 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
bf10: 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a  the rowid..**.**
bf20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
bf30: 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  ght attempt to r
bf40: 65 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f  euse the value o
bf50: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68 61  f the column tha
bf60: 74 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  t.** has already
bf70: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   been loaded int
bf80: 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 54  o a register.  T
bf90: 68 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 61 6c  he value will al
bfa0: 77 61 79 73 0a 2a 2a 20 62 65 20 75 73 65 64 20  ways.** be used 
bfb0: 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 75 6e  if it has not un
bfc0: 64 65 72 67 6f 6e 65 20 61 6e 79 20 61 66 66 69  dergone any affi
bfd0: 6e 69 74 79 20 63 68 61 6e 67 65 73 2e 20 20 42  nity changes.  B
bfe0: 75 74 20 69 66 0a 2a 2a 20 61 6e 20 61 66 66 69  ut if.** an affi
bff0: 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73 20  nity change has 
c000: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
c010: 68 65 20 63 61 63 68 65 64 20 76 61 6c 75 65 20  he cached value 
c020: 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20  will only be.** 
c030: 75 73 65 64 20 69 66 20 61 6c 6c 6f 77 41 66 66  used if allowAff
c040: 43 68 6e 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Chng is true..*/
c050: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c060: 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20  CodeGetColumn(. 
c070: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c080: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
c090: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
c0a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
c0b0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
c0c0: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
c0d0: 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
c0e0: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
c0f0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
c100: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
c110: 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
c120: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
c130: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
c140: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
c150: 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
c160: 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20   int iReg,      
c170: 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
c180: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
c190: 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20 2f 2a   allowAffChng /*
c1a0: 20 54 72 75 65 20 69 66 20 70 72 69 6f 72 20 61   True if prior a
c1b0: 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 20  ffinity changes 
c1c0: 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a 20 20 56  are OK */.){.  V
c1d0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c1e0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
c1f0: 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
c200: 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
c210: 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
c220: 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50 61 72 73  olCache; i<pPars
c230: 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
c240: 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
c250: 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
c260: 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
c270: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
c280: 20 20 20 20 20 26 26 20 28 21 70 2d 3e 61 66 66       && (!p->aff
c290: 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c 6f 77 41  Change || allowA
c2a0: 66 66 43 68 6e 67 29 20 29 7b 0a 23 69 66 20 30  ffChng) ){.#if 0
c2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c2c0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
c2d0: 6f 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oop);.      Vdbe
c2e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 50 54  Comment((v, "OPT
c2f0: 3a 20 74 61 62 25 64 2e 63 6f 6c 25 64 20 2d 3e  : tab%d.col%d ->
c300: 20 72 25 64 22 2c 20 69 54 61 62 6c 65 2c 20 69   r%d", iTable, i
c310: 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52 65 67 29  Column, p->iReg)
c320: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
c330: 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a  return p->iReg;.
c340: 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73      }.  }  .  as
c350: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
c360: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
c370: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70  .    int op = (p
c380: 54 61 62 20 26 26 20 49 73 56 69 72 74 75 61 6c  Tab && IsVirtual
c390: 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f  (pTab)) ? OP_VRo
c3a0: 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a  wid : OP_Rowid;.
c3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c3c0: 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp2(v, op, iTa
c3d0: 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65  ble, iReg);.  }e
c3e0: 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20  lse if( pTab==0 
c3f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c410: 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
c420: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
c430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
c440: 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
c450: 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
c460: 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
c470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c480: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
c490: 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
c4a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  g);.    sqlite3C
c4b0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
c4c0: 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  pTab, iColumn);.
c4d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c4e0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
c4f0: 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  NT.    if( pTab-
c500: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
c510: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c520: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
c530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c540: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
c550: 66 69 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20  finity, iReg);. 
c560: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
c570: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 69    if( pParse->di
c580: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
c590: 20 29 7b 0a 20 20 20 20 69 20 3d 20 70 50 61 72   ){.    i = pPar
c5a0: 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 3b 0a 20  se->iColCache;. 
c5b0: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
c5c0: 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b 0a 20 20  aColCache[i];.  
c5d0: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
c5e0: 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  able;.    p->iCo
c5f0: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a  lumn = iColumn;.
c600: 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
c610: 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66 66 43 68  eg;.    p->affCh
c620: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 2b  ange = 0;.    i+
c630: 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72  +;.    if( i>=Ar
c640: 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
c650: 61 43 6f 6c 43 61 63 68 65 29 20 29 20 69 20 3d  aColCache) ) i =
c660: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 3e 70 50   0;.    if( i>pP
c670: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
c680: 29 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ) pParse->nColCa
c690: 63 68 65 20 3d 20 69 3b 0a 20 20 20 20 70 50 61  che = i;.    pPa
c6a0: 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
c6b0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
c6c0: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
c6d0: 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
c6e0: 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 20 61   cache entries a
c6f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
c700: 68 65 20 76 64 62 65 0a 2a 2a 20 63 75 72 73 6f  he vdbe.** curso
c710: 72 20 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75  r with cursor nu
c720: 6d 62 65 72 20 69 54 61 62 6c 65 2e 0a 2a 2f 0a  mber iTable..*/.
c730: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
c740: 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65  ClearColumnCache
c750: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c760: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69  int iTable){.  i
c770: 66 28 20 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  f( iTable<0 ){. 
c780: 20 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43     pParse->nColC
c790: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
c7a0: 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20  arse->iColCache 
c7b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
c7c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
c7d0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
c7e0: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
c7f0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
c800: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e  e->aColCache[i].
c810: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
c820: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
c830: 73 65 28 20 69 3d 3d 70 50 61 72 73 65 2d 3e 6e  se( i==pParse->n
c840: 43 6f 6c 43 61 63 68 65 2d 31 20 29 3b 0a 20 20  ColCache-1 );.  
c850: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 43        pParse->aC
c860: 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20 70 50 61  olCache[i] = pPa
c870: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d  rse->aColCache[-
c880: 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  -pParse->nColCac
c890: 68 65 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61  he];.        pPa
c8a0: 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20 3d  rse->iColCache =
c8b0: 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63   pParse->nColCac
c8c0: 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  he;.      }.    
c8d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
c8e0: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
c8f0: 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20  hat an affinity 
c900: 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
c910: 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a  red on iCount.**
c920: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
c930: 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e  ing with iStart.
c940: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c950: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
c960: 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70  yChange(Parse *p
c970: 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72  Parse, int iStar
c980: 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a  t, int iCount){.
c990: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 53 74    int iEnd = iSt
c9a0: 61 72 74 20 2b 20 69 43 6f 75 6e 74 20 2d 20 31  art + iCount - 1
c9b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c9c0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
c9d0: 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b  nColCache; i++){
c9e0: 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61  .    int r = pPa
c9f0: 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
ca00: 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ].iReg;.    if( 
ca10: 72 3e 3d 69 53 74 61 72 74 20 26 26 20 72 3c 3d  r>=iStart && r<=
ca20: 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 50  iEnd ){.      pP
ca30: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
ca40: 69 5d 2e 61 66 66 43 68 61 6e 67 65 20 3d 20 31  i].affChange = 1
ca50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ca60: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ca70: 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
ca80: 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
ca90: 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
caa0: 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
cab0: 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
cac0: 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
cad0: 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
cae0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
caf0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
cb00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cb10: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
cb20: 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 69 46   int i;.  if( iF
cb40: 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65 74 75 72  rom==iTo ) retur
cb50: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
cb60: 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
cb70: 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
cb80: 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
cb90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
cba0: 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
cbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
cbc0: 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  x = pParse->aCol
cbd0: 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20  Cache[i].iReg;. 
cbe0: 20 20 20 69 66 28 20 78 3e 3d 69 46 72 6f 6d 20     if( x>=iFrom 
cbf0: 26 26 20 78 3c 69 46 72 6f 6d 2b 6e 52 65 67 20  && x<iFrom+nReg 
cc00: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
cc10: 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52  >aColCache[i].iR
cc20: 65 67 20 2b 3d 20 69 54 6f 2d 69 46 72 6f 6d 3b  eg += iTo-iFrom;
cc30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
cc40: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
cc50: 65 20 74 6f 20 63 6f 70 79 20 63 6f 6e 74 65 6e  e to copy conten
cc60: 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
cc70: 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
cc80: 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
cc90: 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
cca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ccb0: 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50 61  3ExprCodeCopy(Pa
ccc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ccd0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
cce0: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
ccf0: 74 20 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d  t i;.  if( iFrom
cd00: 3d 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a  ==iTo ) return;.
cd10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
cd20: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  g; i++){.    sql
cd30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
cd40: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
cd50: 5f 43 6f 70 79 2c 20 69 46 72 6f 6d 2b 69 2c 20  _Copy, iFrom+i, 
cd60: 69 54 6f 2b 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  iTo+i);.  }.}../
cd70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
cd80: 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
cd90: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
cda0: 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
cdb0: 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
cdc0: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
cdd0: 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
cde0: 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
cdf0: 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
ce00: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
ce10: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
ce20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
ce30: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
ce40: 43 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a  ColCache; i++){.
ce50: 20 20 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72      int r = pPar
ce60: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d  se->aColCache[i]
ce70: 2e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  .iReg;.    if( r
ce80: 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
ce90: 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  o ) return 1;.  
cea0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ceb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 73 20 69 73  ./*.** Theres is
cec0: 20 61 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69   a value in regi
ced0: 73 74 65 72 20 69 43 75 72 72 65 6e 74 2e 20 20  ster iCurrent.  
cee0: 57 65 20 75 6c 74 69 6d 61 74 65 6c 79 20 77 61  We ultimately wa
cef0: 6e 74 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  nt.** the value 
cf00: 74 6f 20 62 65 20 69 6e 20 72 65 67 69 73 74 65  to be in registe
cf10: 72 20 69 54 61 72 67 65 74 2e 20 20 49 74 20 6d  r iTarget.  It m
cf20: 69 67 68 74 20 62 65 20 74 68 61 74 0a 2a 2a 20  ight be that.** 
cf30: 69 43 75 72 72 65 6e 74 20 61 6e 64 20 69 54 61  iCurrent and iTa
cf40: 72 67 65 74 20 61 72 65 20 74 68 65 20 73 61 6d  rget are the sam
cf50: 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a  e register..**.*
cf60: 2a 20 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74  * We are going t
cf70: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c  o modify the val
cf80: 75 65 2c 20 73 6f 20 77 65 20 6e 65 65 64 20 74  ue, so we need t
cf90: 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 0a 2a  o make sure it.*
cfa0: 2a 20 69 73 20 6e 6f 74 20 61 20 63 61 63 68 65  * is not a cache
cfb0: 64 20 72 65 67 69 73 74 65 72 2e 20 20 49 66 20  d register.  If 
cfc0: 69 43 75 72 72 65 6e 74 20 69 73 20 61 20 63 61  iCurrent is a ca
cfd0: 63 68 65 64 20 72 65 67 69 73 74 65 72 2c 0a 2a  ched register,.*
cfe0: 2a 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6d 6f  * then try to mo
cff0: 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65  ve the value ove
d000: 72 20 74 6f 20 69 54 61 72 67 65 74 2e 20 20 49  r to iTarget.  I
d010: 66 20 69 54 61 72 67 65 74 20 69 73 20 61 0a 2a  f iTarget is a.*
d020: 2a 20 63 61 63 68 65 64 20 72 65 67 69 73 74 65  * cached registe
d030: 72 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68  r, then clear th
d040: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d050: 63 61 63 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a  cache line..**.*
d060: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
d070: 69 73 74 65 72 20 74 68 61 74 20 74 68 65 20 76  ister that the v
d080: 61 6c 75 65 20 65 6e 64 73 20 75 70 20 69 6e 2e  alue ends up in.
d090: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
d0a0: 78 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73  xprWritableRegis
d0b0: 74 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ter(Parse *pPars
d0c0: 65 2c 20 69 6e 74 20 69 43 75 72 72 65 6e 74 2c  e, int iCurrent,
d0d0: 20 69 6e 74 20 69 54 61 72 67 65 74 29 7b 0a 20   int iTarget){. 
d0e0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
d0f0: 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
d100: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 75 73 65  =0 );.  if( !use
d110: 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
d120: 50 61 72 73 65 2c 20 69 43 75 72 72 65 6e 74 2c  Parse, iCurrent,
d130: 20 69 43 75 72 72 65 6e 74 29 20 29 7b 0a 20 20   iCurrent) ){.  
d140: 20 20 72 65 74 75 72 6e 20 69 43 75 72 72 65 6e    return iCurren
d150: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 75  t;.  }.  if( iCu
d160: 72 72 65 6e 74 21 3d 69 54 61 72 67 65 74 20 29  rrent!=iTarget )
d170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d180: 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
d190: 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
d1a0: 20 69 43 75 72 72 65 6e 74 2c 20 69 54 61 72 67   iCurrent, iTarg
d1b0: 65 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  et);.  }.  for(i
d1c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  =0; i<pParse->nC
d1d0: 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20  olCache; i++){. 
d1e0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
d1f0: 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
d200: 3d 3d 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20  ==iTarget ){.   
d210: 20 20 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43     pParse->aColC
d220: 61 63 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65  ache[i] = pParse
d230: 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50  ->aColCache[--pP
d240: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d  arse->nColCache]
d250: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d260: 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72  iColCache = pPar
d270: 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20  se->nColCache;. 
d280: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d290: 6e 20 69 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a  n iTarget;.}../*
d2a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
d2b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 64 65  instruction code
d2c0: 64 20 69 73 20 61 6e 20 65 70 68 65 6d 65 72 61  d is an ephemera
d2d0: 6c 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 6f 66  l copy of any of
d2e0: 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
d2f0: 73 20 69 6e 20 74 68 65 20 6e 52 65 67 20 72 65  s in the nReg re
d300: 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
d310: 67 20 77 69 74 68 20 69 52 65 67 2c 20 74 68 65  g with iReg, the
d320: 6e 0a 2a 2a 20 63 6f 6e 76 65 72 74 20 74 68 65  n.** convert the
d330: 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
d340: 6e 20 66 72 6f 6d 20 4f 50 5f 53 43 6f 70 79 20  n from OP_SCopy 
d350: 74 6f 20 4f 50 5f 43 6f 70 79 2e 0a 2a 2f 0a 76  to OP_Copy..*/.v
d360: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 48  oid sqlite3ExprH
d370: 61 72 64 43 6f 70 79 28 50 61 72 73 65 20 2a 70  ardCopy(Parse *p
d380: 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
d390: 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
d3a0: 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65 4f 70  t addr;.  VdbeOp
d3b0: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 20 2a 76   *pOp;.  Vdbe *v
d3c0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
d3d0: 3e 70 56 64 62 65 3b 0a 20 20 61 64 64 72 20 3d  >pVdbe;.  addr =
d3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d3f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 70 4f  entAddr(v);.  pO
d400: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
d410: 65 74 4f 70 28 76 2c 20 61 64 64 72 2d 31 29 3b  etOp(v, addr-1);
d420: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 20 7c  .  assert( pOp |
d430: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
d440: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d450: 69 66 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e  if( pOp && pOp->
d460: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 43 6f 70 79  opcode==OP_SCopy
d470: 20 26 26 20 70 4f 70 2d 3e 70 31 3e 3d 69 52 65   && pOp->p1>=iRe
d480: 67 20 26 26 20 70 4f 70 2d 3e 70 31 3c 69 52 65  g && pOp->p1<iRe
d490: 67 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 70 4f  g+nReg ){.    pO
d4a0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  p->opcode = OP_C
d4b0: 6f 70 79 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  opy;.  }.}../*.*
d4c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d4d0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  to store the val
d4e0: 75 65 20 6f 66 20 74 68 65 20 69 41 6c 69 61 73  ue of the iAlias
d4f0: 2d 74 68 20 61 6c 69 61 73 20 69 6e 20 72 65 67  -th alias in reg
d500: 69 73 74 65 72 0a 2a 2a 20 74 61 72 67 65 74 2e  ister.** target.
d510: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
d520: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
d530: 20 70 45 78 70 72 20 69 73 20 65 76 61 6c 75 61   pExpr is evalua
d540: 74 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  ted to compute.*
d550: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
d560: 68 65 20 61 6c 69 61 73 2e 20 20 54 68 65 20 76  he alias.  The v
d570: 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69  alue is stored i
d580: 6e 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20 72  n an auxiliary r
d590: 65 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 74  egister.** and t
d5a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 61  he number of tha
d5b0: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
d5c0: 74 75 72 6e 65 64 2e 20 20 4f 6e 20 73 75 62 73  turned.  On subs
d5d0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 0a 2a 2a  equent calls,.**
d5e0: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75   the register nu
d5f0: 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  mber is returned
d600: 20 77 69 74 68 6f 75 74 20 67 65 6e 65 72 61 74   without generat
d610: 69 6e 67 20 61 6e 79 20 63 6f 64 65 2e 0a 2a 2a  ing any code..**
d620: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e  .** Note that in
d630: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
d640: 74 6f 20 77 6f 72 6b 2c 20 63 6f 64 65 20 6d 75  to work, code mu
d650: 73 74 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  st be generated 
d660: 69 6e 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6f  in the.** same o
d670: 72 64 65 72 20 74 68 61 74 20 69 74 20 69 73 20  rder that it is 
d680: 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  executed..**.** 
d690: 41 6c 69 61 73 65 73 20 61 72 65 20 6e 75 6d 62  Aliases are numb
d6a0: 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 77 69  ered starting wi
d6b0: 74 68 20 31 2e 20 20 53 6f 20 69 41 6c 69 61 73  th 1.  So iAlias
d6c0: 20 69 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65   is in the range
d6d0: 0a 2a 2a 20 6f 66 20 31 20 74 6f 20 70 50 61 72  .** of 1 to pPar
d6e0: 73 65 2d 3e 6e 41 6c 69 61 73 20 69 6e 63 6c 75  se->nAlias inclu
d6f0: 73 69 76 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 70 50  sive.  .**.** pP
d700: 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41 6c  arse->aAlias[iAl
d710: 69 61 73 2d 31 5d 20 72 65 63 6f 72 64 73 20 74  ias-1] records t
d720: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
d730: 65 72 20 77 68 65 72 65 20 74 68 65 20 76 61 6c  er where the val
d740: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 41 6c  ue.** of the iAl
d750: 69 61 73 2d 74 68 20 61 6c 69 61 73 20 69 73 20  ias-th alias is 
d760: 73 74 6f 72 65 64 2e 20 20 49 66 20 7a 65 72 6f  stored.  If zero
d770: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
d780: 74 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 68  t the.** alias h
d790: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
d7a0: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
d7b0: 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 69 61  tic int codeAlia
d7c0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d7d0: 20 69 6e 74 20 69 41 6c 69 61 73 2c 20 45 78 70   int iAlias, Exp
d7e0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
d7f0: 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  rget){.  sqlite3
d800: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d810: 62 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 0a 20  b;.  int iReg;. 
d820: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 41 6c   if( pParse->nAl
d830: 69 61 73 41 6c 6c 6f 63 3c 70 50 61 72 73 65 2d  iasAlloc<pParse-
d840: 3e 6e 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >nAlias ){.    p
d850: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20  Parse->aAlias = 
d860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
d870: 4f 72 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  OrFree(db, pPars
d880: 65 2d 3e 61 41 6c 69 61 73 2c 0a 20 20 20 20 20  e->aAlias,.     
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
d8b0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
d8c0: 73 5b 30 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41  s[0])*pParse->nA
d8d0: 6c 69 61 73 20 29 3b 0a 20 20 20 20 74 65 73 74  lias );.    test
d8e0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
d8f0: 46 61 69 6c 65 64 20 26 26 20 70 50 61 72 73 65  Failed && pParse
d900: 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 3e 30 20  ->nAliasAlloc>0 
d910: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
d920: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
d930: 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 73  turn 0;.    mems
d940: 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 6c 69  et(&pParse->aAli
d950: 61 73 5b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  as[pParse->nAlia
d960: 73 41 6c 6c 6f 63 5d 2c 20 30 2c 0a 20 20 20 20  sAlloc], 0,.    
d970: 20 20 20 20 20 20 20 28 70 50 61 72 73 65 2d 3e         (pParse->
d980: 6e 41 6c 69 61 73 2d 70 50 61 72 73 65 2d 3e 6e  nAlias-pParse->n
d990: 41 6c 69 61 73 41 6c 6c 6f 63 29 2a 73 69 7a 65  AliasAlloc)*size
d9a0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 6c 69 61  of(pParse->aAlia
d9b0: 73 5b 30 5d 29 29 3b 0a 20 20 20 20 70 50 61 72  s[0]));.    pPar
d9c0: 73 65 2d 3e 6e 41 6c 69 61 73 41 6c 6c 6f 63 20  se->nAliasAlloc 
d9d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  = pParse->nAlias
d9e0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d9f0: 69 41 6c 69 61 73 3e 30 20 26 26 20 69 41 6c 69  iAlias>0 && iAli
da00: 61 73 3c 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 69  as<=pParse->nAli
da10: 61 73 20 29 3b 0a 20 20 69 52 65 67 20 3d 20 70  as );.  iReg = p
da20: 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 69 41  Parse->aAlias[iA
da30: 6c 69 61 73 2d 31 5d 3b 0a 20 20 69 66 28 20 69  lias-1];.  if( i
da40: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Reg==0 ){.    if
da50: 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
da60: 65 43 6f 6c 43 61 63 68 65 20 29 7b 0a 20 20 20  eColCache ){.   
da70: 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
da80: 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
da90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
daa0: 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 65 6c 73  arget);.    }els
dab0: 65 7b 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20  e{.      iReg = 
dac0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
dad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dae0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
daf0: 78 70 72 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  xpr, iReg);.    
db00: 20 20 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73    pParse->aAlias
db10: 5b 69 41 6c 69 61 73 2d 31 5d 20 3d 20 69 52 65  [iAlias-1] = iRe
db20: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  g;.    }.  }.  r
db30: 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
db40: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
db50: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
db60: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
db70: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
db80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
db90: 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
dba0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
dbb0: 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
dbc0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
dbd0: 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
dbe0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
dbf0: 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
dc00: 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
dc10: 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
dc20: 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
dc30: 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
dc40: 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
dc50: 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
dc60: 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
dc70: 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
dc80: 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
dc90: 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
dca0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
dcb0: 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
dcc0: 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
dcd0: 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
dce0: 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
dcf0: 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
dd00: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
dd10: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
dd20: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
dd30: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
dd40: 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
dd50: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
dd60: 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
dd70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
dd80: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
ddb0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
ddc0: 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
ddd0: 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
dde0: 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
ddf0: 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
de00: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
de10: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
de20: 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
de30: 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
de40: 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
de50: 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
de60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
de70: 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
de80: 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
de90: 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
dea0: 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20  1, r2, r3, r4;  
deb0: 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
dec0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
ded0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
dee0: 62 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  b;..  db = pPars
def0: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
df00: 20 76 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v!=0 || db->mal
df10: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
df20: 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
df30: 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
df40: 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
df50: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
df60: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
df70: 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
df80: 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
df90: 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
dfa0: 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
dfb0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
dfc0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
dfd0: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
dfe0: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
dff0: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
e000: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
e010: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
e020: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
e030: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
e040: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
e050: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
e060: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e070: 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
e080: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
e090: 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
e0a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e0b0: 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
e0c0: 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
e0d0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
e0e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e0f0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
e100: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
e110: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
e140: 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20  lumn, target);. 
e150: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e160: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
e170: 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
e180: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
e190: 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
e1a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e1b0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
e1c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
e1d0: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
e1e0: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
e1f0: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
e200: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
e210: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
e220: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
e230: 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Base>0 );.      
e240: 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
e250: 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73  >iColumn + pPars
e260: 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20  e->ckBase;.     
e270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e280: 74 65 73 74 63 61 73 65 28 20 28 70 45 78 70 72  testcase( (pExpr
e290: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79  ->flags & EP_Any
e2a0: 41 66 66 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  Aff)!=0 );.     
e2b0: 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
e2c0: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
e2d0: 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
e2e0: 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
e310: 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d  >iColumn, pExpr-
e320: 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 2c  >iTable, target,
e330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26    pExpr->flags &
e360: 20 45 50 5f 41 6e 79 41 66 66 29 3b 0a 20 20 20   EP_AnyAff);.   
e370: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e390: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
e3a0: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
e3b0: 28 76 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  (v, pExpr, 0, ta
e3c0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
e3d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e3e0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
e3f0: 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
e400: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
e410: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
e420: 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65  oken.n, 0, targe
e430: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
e440: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e450: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
e460: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
e470: 65 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 29  eExpr(db, pExpr)
e480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e490: 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53  dbeAddOp4(v,OP_S
e4a0: 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
e4b0: 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
e4d0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
e4e0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
e4f0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
e500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e510: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
e520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e530: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
e540: 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
e550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e570: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
e580: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
e590: 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
e5a0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
e5b0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61  ar *z;.      cha
e5c0: 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20  r *zBlob;.      
e5d0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
e5e0: 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20  oken.n>=3 );.   
e5f0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e600: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78  ->token.z[0]=='x
e610: 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ' || pExpr->toke
e620: 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  n.z[0]=='X' );. 
e630: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e640: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d  pr->token.z[1]==
e650: 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61 73  '\'' );.      as
e660: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b  sert( pExpr->tok
e670: 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b 65  en.z[pExpr->toke
e680: 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.n-1]=='\'' );.
e690: 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d        n = pExpr-
e6a0: 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20  >token.n - 3;.  
e6b0: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70      z = (char*)p
e6c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20  Expr->token.z + 
e6d0: 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  2;.      zBlob =
e6e0: 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
e6f0: 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
e700: 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
e710: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e720: 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
e730: 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
e740: 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
e750: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e760: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
e770: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
e780: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
e790: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e7a0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
e7b0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67  pr->iTable, targ
e7c0: 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
e7d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
e7e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e7f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
e800: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
e810: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
e820: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
e830: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e840: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e850: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
e860: 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
e870: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
e880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
e8a0: 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
e8b0: 20 63 6f 64 65 41 6c 69 61 73 28 70 50 61 72 73   codeAlias(pPars
e8c0: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
e8d0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
e8e0: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
e8f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
e900: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e910: 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
e920: 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
e930: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
e940: 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
e950: 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
e960: 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
e970: 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
e980: 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
e990: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
e9a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e9b0: 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
e9c0: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
e9d0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70  3AffinityType(&p
e9e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Expr->token);.  
e9f0: 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20      to_op = aff 
ea00: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
ea10: 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20  T + OP_ToText;. 
ea20: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
ea30: 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20  op==OP_ToText   
ea40: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
ea50: 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20  AFF_TEXT    );. 
ea60: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
ea70: 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20  op==OP_ToBlob   
ea80: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
ea90: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20  AFF_NONE    );. 
eaa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
eab0: 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  op==OP_ToNumeric
eac0: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
ead0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
eae0: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
eaf0: 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20  op==OP_ToInt    
eb00: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
eb10: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
eb20: 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f       assert( to_
eb30: 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20  op==OP_ToReal   
eb40: 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f   || aff!=SQLITE_
eb50: 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20  AFF_REAL    );. 
eb60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
eb70: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
eb80: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
eb90: 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  e( to_op==OP_ToB
eba0: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65 73  lob );.      tes
ebb0: 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
ebc0: 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20 20  _ToNumeric );.  
ebd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
ebe0: 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29 3b  _op==OP_ToInt );
ebf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ec00: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
ec10: 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  l );.      if( i
ec20: 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a  nReg!=target ){.
ec30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ec50: 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61  SCopy, inReg, ta
ec60: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  rget);.        i
ec70: 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
ec80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ec90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
eca0: 2c 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b  , to_op, inReg);
ecb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ecc0: 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
ecd0: 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  he(pParse, inReg
ece0: 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20  , inReg) );.    
ecf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
ed00: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
ed10: 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
ed20: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
ed30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
ed40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
ed50: 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
ed60: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
ed70: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
ed80: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
ed90: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
eda0: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
edb0: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
edc0: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
edd0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
ede0: 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
edf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ee00: 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
ee10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ee20: 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
ee30: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ee40: 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
ee50: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
ee60: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
ee70: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
ee80: 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LT );.      te
ee90: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
eea0: 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
eeb0: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29  ase( op==TK_GT )
eec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
eed0: 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ( op==TK_GE );. 
eee0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
eef0: 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
ef00: 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
ef10: 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 63  TK_NE );.      c
ef20: 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
ef30: 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ds(pParse, pExpr
ef40: 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  ->pLeft, &r1, &r
ef50: 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ef80: 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26  ->pRight, &r2, &
ef90: 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
efa0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
efb0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
efc0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
efd0: 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
efe0: 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
eff0: 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
f000: 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65  OREP2);.      te
f010: 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
f020: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
f030: 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
f040: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
f050: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f060: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
f070: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
f080: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
f090: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
f0a0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
f0b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
f0c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
f0d0: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
f0e0: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
f0f0: 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
f100: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
f110: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
f120: 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
f130: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
f140: 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
f150: 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
f160: 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
f170: 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
f180: 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
f190: 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
f1a0: 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
f1b0: 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
f1c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f1d0: 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
f1e0: 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
f1f0: 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
f200: 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
f210: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
f220: 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
f230: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f240: 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
f250: 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
f260: 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
f270: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
f280: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f290: 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
f2a0: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
f2b0: 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
f2c0: 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
f2d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f2e0: 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20  p==TK_AND );.   
f2f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
f300: 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
f310: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f320: 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74  _PLUS );.      t
f330: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f340: 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74  MINUS );.      t
f350: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f360: 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73  REM );.      tes
f370: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
f380: 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65  TAND );.      te
f390: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
f3a0: 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65  ITOR );.      te
f3b0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
f3c0: 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65  LASH );.      te
f3d0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
f3e0: 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
f3f0: 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
f400: 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
f410: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
f420: 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20  _CONCAT );.     
f430: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
f440: 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
f450: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
f460: 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
f470: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
f480: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
f490: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
f4a0: 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
f4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f4c0: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c  ddOp3(v, op, r2,
f4d0: 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
f4e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
f4f0: 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
f500: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
f510: 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
f520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f530: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
f540: 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
f550: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
f560: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
f570: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
f580: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
f590: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
f5a0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
f5b0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f5c0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
f5d0: 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
f5e0: 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
f5f0: 20 28 63 68 61 72 2a 29 70 4c 65 66 74 2d 3e 74   (char*)pLeft->t
f600: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
f610: 6f 6b 65 6e 2e 6e 2c 20 31 2c 20 74 61 72 67 65  oken.n, 1, targe
f620: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
f630: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
f640: 65 49 6e 74 65 67 65 72 28 76 2c 20 70 4c 65 66  eInteger(v, pLef
f650: 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  t, 1, target);. 
f660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
f680: 67 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71  gFree1 = r1 = sq
f690: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f6a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
f6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f6c0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f6d0: 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , 0, r1);.      
f6e0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
f6f0: 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
f700: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f710: 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f730: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
f740: 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
f750: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
f760: 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
f770: 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
f780: 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
f790: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
f7a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f7b0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
f7c0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
f7d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f7e0: 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
f7f0: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
f800: 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
f810: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Not );.      tes
f820: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
f830: 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65  TNOT );.      te
f840: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
f850: 4f 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  OT );.      inRe
f860: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
f870: 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
f880: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
f890: 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
f8a0: 65 73 74 63 61 73 65 28 20 69 6e 52 65 67 3d 3d  estcase( inReg==
f8b0: 74 61 72 67 65 74 20 29 3b 0a 20 20 20 20 20 20  target );.      
f8c0: 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
f8d0: 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
f8e0: 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
f8f0: 29 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  ) );.      inReg
f900: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 72   = sqlite3ExprWr
f910: 69 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 70  itableRegister(p
f920: 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 74 61  Parse, inReg, ta
f930: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
f940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f950: 2c 20 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20  , op, inReg);.  
f960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f970: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
f980: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
f990: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
f9a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
f9b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
f9c0: 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
f9d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f9e0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
f9f0: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
fa00: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
fa10: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
fa20: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
fa30: 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
fa40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa50: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fa60: 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
fa70: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
fa80: 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
fa90: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
faa0: 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
fab0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
fac0: 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
fad0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
faf0: 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
fb20: 20 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20   target, -1);.  
fb30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fb40: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
fb50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fb60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fb70: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
fb80: 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
fb90: 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
fba0: 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
fbb0: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
fbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
fbd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
fbe0: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
fbf0: 61 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20  ate: %T",.      
fc00: 20 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70        &pExpr->sp
fc10: 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  an);.      }else
fc20: 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
fc30: 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
fc40: 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
fc50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fc70: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
fc80: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
fc90: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
fca0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
fcb0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
fcc0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
fcd0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
fce0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
fcf0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
fd00: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
fd10: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
fd20: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
fd30: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
fd40: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
fd50: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
fd60: 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f  NC(db);.      Co
fd70: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
fd80: 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ;..      testcas
fd90: 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f  e( op==TK_CONST_
fda0: 46 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65  FUNC );.      te
fdb0: 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46  stcase( op==TK_F
fdc0: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
fdd0: 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
fde0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
fdf0: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
fe00: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
fe10: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
fe20: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
fe30: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
fe40: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
fe50: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
fe60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
fe70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  t ){.        nEx
fe80: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
fe90: 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  r;.        r1 = 
fea0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
feb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70  nge(pParse, nExp
fec0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
fed0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
fee0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
fef0: 74 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20  t, r1, 1);.     
ff00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ff10: 6e 45 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a  nExpr = r1 = 0;.
ff20: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
ff30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
ff40: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
ff50: 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
ff60: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
ff70: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
ff80: 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
ff90: 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
ffa0: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
ffb0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
ffc0: 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
ffd0: 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
ffe0: 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
fff0: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
10000 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
10010 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
10020 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
10030 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
10040 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
10050 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
10060 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
10070 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
10080 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
10090 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
100a0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
100b0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
100c0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
100d0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
100e0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
100f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
10100 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
10110 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
10120 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
10130 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
10140 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
10150 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
10160 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
10170 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
10180 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
10190 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
101a0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
101b0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
101c0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
101d0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
101e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
101f0 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
10200 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
10210 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
10220 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
10230 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
10240 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
10250 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31  Expr, pList->a[1
10260 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10270 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e  }else if( nExpr>
10280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
10290 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
102a0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
102b0 64 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c  db, pDef, nExpr,
102c0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
102d0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
102e0 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  dif.      for(i=
102f0 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
10300 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
10310 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10320 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
10330 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
10340 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
10350 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
10360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10370 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 6c     if( (pDef->fl
10380 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
10390 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26  C_NEEDCOLL)!=0 &
103a0 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
103b0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
103c0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
103d0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
103e0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
103f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10400 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
10410 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
10420 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
10430 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
10440 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
10450 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
10460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10470 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
10480 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  Seq, 0, 0, 0, (c
10490 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
104a0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
104b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
104c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
104d0 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
104e0 61 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c  ask, r1, target,
104f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10500 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
10510 70 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46  pDef, P4_FUNCDEF
10520 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10530 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
10540 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  nExpr);.      if
10550 28 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( nExpr ){.     
10560 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10570 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
10580 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
10590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
105a0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
105b0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
105c0 73 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a  se, r1, nExpr);.
105d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
105e0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
105f0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
10600 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
10610 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
10620 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
10630 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
10640 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
10650 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
10660 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
10670 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
10680 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
10690 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
106a0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
106b0 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
106c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65      }.      inRe
106d0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
106e0 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mn;.      break;
106f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10700 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
10710 6e 74 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 30  nt rNotFound = 0
10720 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 4d 61 79  ;.      int rMay
10730 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  HaveNull = 0;.  
10740 20 20 20 20 69 6e 74 20 6a 32 2c 20 6a 33 2c 20      int j2, j3, 
10750 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63 68  j4, j5;.      ch
10760 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
10770 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20     int eType;.. 
10780 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
10790 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20  ment((v, "begin 
107a0 49 4e 20 65 78 70 72 20 72 25 64 22 2c 20 74 61  IN expr r%d", ta
107b0 72 67 65 74 29 29 3b 0a 20 20 20 20 20 20 65 54  rget));.      eT
107c0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
107d0 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
107e0 20 70 45 78 70 72 2c 20 26 72 4d 61 79 48 61 76   pExpr, &rMayHav
107f0 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 69 66  eNull);.      if
10800 28 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 29  ( rMayHaveNull )
10810 7b 0a 20 20 20 20 20 20 20 20 72 4e 6f 74 46 6f  {.        rNotFo
10820 75 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  und = ++pParse->
10830 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nMem;.      }.. 
10840 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
10850 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
10860 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
10870 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
10880 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
10890 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
108a0 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
108b0 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
108c0 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
108d0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20  for.      ** P4 
108e0 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
108f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10900 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
10910 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
10920 45 78 70 72 29 3b 0a 0a 0a 20 20 20 20 20 20 2f  Expr);...      /
10930 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
10940 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
10950 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
10960 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
10970 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
10980 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
10990 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
109a0 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
109b0 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
109c0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
109d0 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
109e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
109f0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10a00 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
10a10 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  t);.      pParse
10a20 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
10a30 65 2d 2d 3b 0a 20 20 20 20 20 20 6a 32 20 3d 20  e--;.      j2 = 
10a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a50 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
10a60 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
10a70 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
10a80 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
10a90 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65 33      j3 = sqlite3
10aa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10ab0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 74 61 72 67  _MustBeInt, targ
10ac0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20  et);.        j4 
10ad0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10ae0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
10af0 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  sts, pExpr->iTab
10b00 6c 65 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  le, 0, target);.
10b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10b30 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
10b40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20  et);.        j5 
10b50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10b60 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
10b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b80 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10b90 6a 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j3);.        sql
10ba0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10bb0 28 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 20  (v, j4);.       
10bc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10bd0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10be0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
10bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c00 20 20 20 72 32 20 3d 20 72 65 67 46 72 65 65 32     r2 = regFree2
10c10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10c20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
10c30 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65         /* Create
10c40 20 61 20 72 65 63 6f 72 64 20 61 6e 64 20 74 65   a record and te
10c50 73 74 20 66 6f 72 20 73 65 74 20 6d 65 6d 62 65  st for set membe
10c60 72 73 68 69 70 2e 20 49 66 20 74 68 65 20 73 65  rship. If the se
10c70 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
10c80 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 2c     ** the value,
10c90 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
10ca0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65 73  e end of the tes
10cb0 74 20 63 6f 64 65 2e 20 54 68 65 20 74 61 72 67  t code. The targ
10cc0 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  et.        ** re
10cd0 67 69 73 74 65 72 20 73 74 69 6c 6c 20 63 6f 6e  gister still con
10ce0 74 61 69 6e 73 20 74 68 65 20 74 72 75 65 20 28  tains the true (
10cf0 31 29 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  1) value written
10d00 20 74 6f 20 69 74 20 65 61 72 6c 69 65 72 2e 0a   to it earlier..
10d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10d30 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
10d40 65 63 6f 72 64 2c 20 74 61 72 67 65 74 2c 20 31  ecord, target, 1
10d50 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
10d60 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
10d70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10d80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
10d90 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10da0 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64    j5 = sqlite3Vd
10db0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46  beAddOp3(v, OP_F
10dc0 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
10dd0 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 0a 20 20  ble, 0, r2);..  
10de0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
10df0 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
10e00 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  est fails, then 
10e10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10e20 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 78  e .        ** "x
10e30 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65   IN (...)" expre
10e40 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69  ssion must be ei
10e50 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20  ther 0 or NULL. 
10e60 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  If the set.     
10e70 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e     ** contains n
10e80 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  o NULL values, t
10e90 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
10ea0 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20  s 0. If the set 
10eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
10ec0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
10ed0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
10ee0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
10ef0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
10f00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
10f10 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  so NULL..       
10f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10f30 72 4e 6f 74 46 6f 75 6e 64 3d 3d 30 20 29 7b 0a  rNotFound==0 ){.
10f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
10f50 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
10f60 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
10f70 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 28 6e 6f  compile time (no
10f80 77 29 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  w) that .       
10f90 20 20 20 2a 2a 20 74 68 65 20 73 65 74 20 63 6f     ** the set co
10fa0 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
10fb0 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
10fc0 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
10fd0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  t.          ** o
10fe0 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
10ff0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
11000 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
11010 2e 20 4e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  . No need.      
11020 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
11030 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
11040 65 20 61 74 20 72 75 6e 74 69 6d 65 20 69 6e 20  e at runtime in 
11050 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
11060 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11080 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11090 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
110a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
110b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
110c0 62 6c 6f 63 6b 20 70 6f 70 75 6c 61 74 65 73 20  block populates 
110d0 74 68 65 20 72 4e 6f 74 46 6f 75 6e 64 20 72 65  the rNotFound re
110e0 67 69 73 74 65 72 20 77 69 74 68 20 65 69 74 68  gister with eith
110f0 65 72 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  er NULL.        
11100 20 20 2a 2a 20 6f 72 20 30 20 28 61 6e 20 69 6e    ** or 0 (an in
11110 74 65 67 65 72 20 76 61 6c 75 65 29 2e 20 49 66  teger value). If
11120 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
11130 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ure contains one
11140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
11150 20 6d 6f 72 65 20 4e 55 4c 4c 73 2c 20 74 68 65   more NULLs, the
11160 6e 20 73 65 74 20 72 4e 6f 74 46 6f 75 6e 64 20  n set rNotFound 
11170 74 6f 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  to NULL. Otherwi
11180 73 65 2c 20 73 65 74 20 69 74 0a 20 20 20 20 20  se, set it.     
11190 20 20 20 20 20 2a 2a 20 74 6f 20 30 2e 20 49 66       ** to 0. If
111a0 20 72 65 67 69 73 74 65 72 20 72 4d 61 79 48 61   register rMayHa
111b0 76 65 4e 75 6c 6c 20 69 73 20 61 6c 72 65 61 64  veNull is alread
111c0 79 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  y set to some va
111d0 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lue.          **
111e0 20 6f 74 68 65 72 20 74 68 61 6e 20 4e 55 4c 4c   other than NULL
111f0 2c 20 74 68 65 6e 20 74 68 65 20 74 65 73 74 20  , then the test 
11200 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11210 20 72 75 6e 20 61 6e 64 20 0a 20 20 20 20 20 20   run and .      
11220 20 20 20 20 2a 2a 20 72 4e 6f 74 46 6f 75 6e 64      ** rNotFound
11230 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75   is already popu
11240 6c 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  lated..         
11250 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74   */.          st
11260 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
11270 6e 75 6c 6c 52 65 63 6f 72 64 5b 5d 20 3d 20 7b  nullRecord[] = {
11280 20 30 78 30 32 2c 20 30 78 30 30 20 7d 3b 0a 20   0x02, 0x00 };. 
11290 20 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71           j3 = sq
112a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
112b0 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
112c0 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
112d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
112e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
112f0 4e 75 6c 6c 2c 20 30 2c 20 72 4e 6f 74 46 6f 75  Null, 0, rNotFou
11300 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nd);.          s
11310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11320 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 32 2c 20  (v, OP_Blob, 2, 
11330 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 30 2c  rMayHaveNull, 0,
11340 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11360 75 6c 6c 52 65 63 6f 72 64 2c 20 50 34 5f 53 54  ullRecord, P4_ST
11370 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
11380 20 6a 34 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j4 = sqlite3Vdb
11390 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
113a0 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
113b0 6c 65 2c 20 30 2c 20 72 4d 61 79 48 61 76 65 4e  le, 0, rMayHaveN
113c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
113d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
113f0 20 30 2c 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a   0, rNotFound);.
11400 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11410 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11420 20 6a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   j4);.          
11430 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11440 65 72 65 28 76 2c 20 6a 33 29 3b 0a 0a 20 20 20  ere(v, j3);..   
11450 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
11460 68 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69  he value of regi
11470 73 74 65 72 20 72 4e 6f 74 46 6f 75 6e 64 20 28  ster rNotFound (
11480 77 68 69 63 68 20 69 73 20 65 69 74 68 65 72 20  which is either 
11490 4e 55 4c 4c 20 6f 72 20 30 29 0a 20 20 20 20 20  NULL or 0).     
114a0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
114b0 20 74 61 72 67 65 74 20 72 65 67 69 73 74 65 72   target register
114c0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
114d0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
114e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
114f0 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20  pression..      
11500 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
11510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11520 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
11530 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 72 67 65 74  NotFound, target
11540 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11550 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11560 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11570 2c 20 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j2);.      sql
11580 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11590 28 76 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 56  (v, j5);.      V
115a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
115b0 65 6e 64 20 49 4e 20 65 78 70 72 20 72 25 64 22  end IN expr r%d"
115c0 2c 20 74 61 72 67 65 74 29 29 3b 0a 20 20 20 20  , target));.    
115d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
115e0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20 20 20  endif.    /*.   
115f0 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
11600 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
11610 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
11620 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
11630 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
11640 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
11650 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
11660 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
11670 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
11680 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
11690 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
116a0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
116b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
116c0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
116d0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
116e0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
116f0 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
11700 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
11710 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
11720 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11730 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
11740 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  r->pList->a;.   
11750 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
11760 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
11770 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ..      codeComp
11780 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72  areOperands(pPar
11790 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31 2c 20  se, pLeft, &r1, 
117a0 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20  &regFree1,.     
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
117d0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
117e0 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee2);.      test
117f0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
11800 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
11810 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
11820 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 73   );.      r3 = s
11830 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11840 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11850 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r4 = sqlite3GetT
11860 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11870 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11880 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11890 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
118c0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
118d0 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
118e0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
118f0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
11900 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
11910 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11920 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
11930 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
11940 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
11950 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
11960 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
11970 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
11980 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =0 );.      code
11990 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
119a0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
119b0 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34  P_Le, r1, r2, r4
119c0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
119d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
119e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
119f0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
11a00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
11a10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11a20 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
11a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
11a40 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11a50 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
11a60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11a70 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
11a80 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
11a90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
11aa0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
11ab0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
11ac0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
11ad0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
11ae0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20     ** Form A:.  
11af0 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48    **   CASE x WH
11b00 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48  EN e1 THEN r1 WH
11b10 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e  EN e2 THEN r2 ..
11b20 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72  . WHEN eN THEN r
11b30 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20  N ELSE y END.   
11b40 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   **.    ** Form 
11b50 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  B:.    **   CASE
11b60 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
11b70 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
11b80 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
11b90 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
11ba0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
11bb0 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74  rm A is can be t
11bc0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20  ransformed into 
11bd0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  the equivalent f
11be0 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73  orm B as follows
11bf0 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
11c00 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72  WHEN x=e1 THEN r
11c10 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e  1 WHEN x=e2 THEN
11c20 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20   r2 ....    **  
11c30 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20        WHEN x=eN 
11c40 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
11c50 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
11c60 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73   X (if it exists
11c70 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  ) is in pExpr->p
11c80 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
11c90 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52 69 67  s in pExpr->pRig
11ca0 68 74 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  ht.  The Y is al
11cb0 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
11cc0 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20 20 20   there is no.   
11cd0 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73 65 20   ** ELSE clause 
11ce0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74 65 72  and no other ter
11cf0 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20  m matches, then 
11d00 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
11d10 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73 73 69  e.    ** exprssi
11d20 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  on is NULL..    
11d30 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
11d40 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
11d50 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
11d60 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
11d70 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
11d80 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
11d90 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11da0 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
11db0 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
11dc0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
11dd0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
11de0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
11df0 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
11e00 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
11e10 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
11e20 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
11e30 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
11e40 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
11e50 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11e60 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
11e70 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
11e80 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
11e90 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
11ec0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
11ed0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
11ee0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
11f10 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
11f20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11f50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
11f60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
11f70 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
11f80 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
11f90 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
11fa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11fb0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
11fc0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
11fd0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
11fe0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
11ff0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
12000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
12010 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
12020 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63 61 63  /.      Expr cac
12030 68 65 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  heX;            
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
12050 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 58  hed expression X
12060 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
12070 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
12080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12090 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
120a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
120b0 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Test;           
120c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
120d0 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
120e0 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
120f0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
12100 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
12110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
12120 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
12130 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
12140 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
12150 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
12160 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
12170 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
12180 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
12190 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
121a0 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
121b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
121c0 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20 73 71     endLabel = sq
121d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
121e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28  el(v);.      if(
121f0 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   (pX = pExpr->pL
12200 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eft)!=0 ){.     
12210 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70 58 3b     cacheX = *pX;
12220 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12230 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  e( pX->op==TK_CO
12240 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  LUMN || pX->op==
12250 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20  TK_REGISTER );. 
12260 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69 54         cacheX.iT
12270 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
12280 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
12290 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65 65 31  e, pX, &regFree1
122a0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
122b0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
122c0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68   );.        cach
122d0 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  eX.op = TK_REGIS
122e0 54 45 52 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  TER;.        opC
122f0 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45  ompare.op = TK_E
12300 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  Q;.        opCom
12310 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61  pare.pLeft = &ca
12320 63 68 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54  cheX;.        pT
12330 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65  est = &opCompare
12340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12350 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
12360 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20  olCache++;.     
12370 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
12380 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
12390 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20     if( pX ){.   
123a0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
123b0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
123c0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
123d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
123e0 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
123f0 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
12400 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
12410 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
12420 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12430 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
12440 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
12450 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
12460 7c 7c 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  || pTest->op==TK
12470 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20  _REGISTER );.   
12480 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12490 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
124a0 70 54 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c  pTest, nextCase,
124b0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
124c0 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  LL);.        tes
124d0 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
124e0 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
124f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
12500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12510 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
12520 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
12530 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20  ISTER );.       
12540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12550 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
12560 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
12570 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
12580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12590 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
125a0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
125b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
125c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
125d0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
125e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
125f0 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
12600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12610 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12620 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67  pr->pRight, targ
12630 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
12640 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12660 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
12670 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
12680 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12690 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
126a0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 61 73  Label);.      as
126b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
126c0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
126d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
126e0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
126f0 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  --;.      break;
12700 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
12710 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
12720 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
12730 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
12740 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
12750 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
12760 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12770 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12790 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
127a0 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
127b0 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
127c0 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
127d0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
127e0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
127f0 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f  iColumn!=OE_Igno
12800 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61  re ){.         a
12810 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
12820 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  olumn==OE_Rollba
12830 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ck ||.          
12840 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
12850 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72  olumn == OE_Abor
12860 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  t ||.           
12870 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
12880 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  lumn == OE_Fail 
12890 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
128a0 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64  te3DequoteExpr(d
128b0 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
128c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
128d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
128e0 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
128f0 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
12900 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  umn, 0,.        
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
12930 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
12940 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20  ken.n);.      } 
12950 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
12960 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
12970 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e  Column == OE_Ign
12980 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ore );.         
12990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129a0 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50  2(v, OP_ContextP
129b0 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
129c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
129d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
129e0 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69  , 0, pParse->tri
129f0 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75  gStack->ignoreJu
12a00 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64  mp);.         Vd
12a10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
12a20 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b  aise(IGNORE)"));
12a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12a40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12a50 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
12a60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12a70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29  Parse, regFree1)
12a80 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
12a90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12aa0 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72  , regFree2);.  r
12ab0 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
12ac0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12ad0 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
12ae0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  an expression an
12af0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
12b00 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65  lts.** into a re
12b10 67 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20  gister.  Return 
12b20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
12b30 62 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65  ber where the re
12b40 73 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f  sults.** are sto
12b50 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
12b60 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
12b70 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
12b80 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  er that can be d
12b90 65 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74  eallocated,.** t
12ba0 68 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75  hen write its nu
12bb0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e  mber into *pReg.
12bc0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
12bd0 72 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a  register is not.
12be0 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20  ** a temporary, 
12bf0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74  then set *pReg t
12c00 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  o zero..*/.int s
12c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
12c20 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
12c30 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
12c40 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
12c50 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
12c60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12c70 0a 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69  .  int r2 = sqli
12c80 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
12c90 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
12ca0 20 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d   r1);.  if( r2==
12cb0 72 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20  r1 ){.    *pReg 
12cc0 3d 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = r1;.  }else{. 
12cd0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12ce0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12cf0 20 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20   r1);.    *pReg 
12d00 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12d10 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n r2;.}../*.** G
12d20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
12d30 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
12d40 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
12d50 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a   and store the.*
12d60 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  * results in reg
12d70 69 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54  ister target.  T
12d80 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67  he results are g
12d90 75 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70  uaranteed to app
12da0 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  ear.** in regist
12db0 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e  er target..*/.in
12dc0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
12dd0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12de0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
12df0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74  t target){.  int
12e00 20 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72   inReg;..  asser
12e10 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74  t( target>0 && t
12e20 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e  arget<=pParse->n
12e30 4d 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d  Mem );.  inReg =
12e40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12e50 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
12e60 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
12e70 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12e80 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65  >pVdbe || pParse
12e90 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
12ea0 65 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 52 65  ed );.  if( inRe
12eb0 67 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61  g!=target && pPa
12ec0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
12ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ee0 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op2(pParse->pVdb
12ef0 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52  e, OP_SCopy, inR
12f00 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  eg, target);.  }
12f10 0a 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74  .  return target
12f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
12f30 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
12f40 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
12f50 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
12f60 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
12f70 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
12f80 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
12f90 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
12fa0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12fb0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
12fc0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
12fd0 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
12fe0 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
12ff0 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
13000 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
13010 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
13020 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
13030 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
13040 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
13050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
13060 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
13070 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
13080 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
13090 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
130a0 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
130b0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
130c0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
130d0 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
130e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
130f0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
13100 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
13110 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
13120 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
13130 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13140 65 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  e;.  int inReg;.
13150 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
13160 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13170 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
13180 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
13190 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 45  et>0 );.  if( pE
131a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
131b0 53 54 45 52 20 29 7b 20 20 0a 20 20 20 20 69 6e  STER ){  .    in
131c0 74 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d  t iMem;.    iMem
131d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
131e0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
131f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
13200 6f 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d  opy, inReg, iMem
13210 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  );.    pExpr->iT
13220 61 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20  able = iMem;.   
13230 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
13240 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20  REGISTER;.  }.  
13250 72 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a  return inReg;.}.
13260 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
13270 55 45 20 69 66 20 70 45 78 70 72 20 69 73 20 61  UE if pExpr is a
13280 6e 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  n constant expre
13290 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70  ssion that is ap
132a0 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72  propriate.** for
132b0 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f   factoring out o
132c0 66 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f  f a loop.  Appro
132d0 70 72 69 61 74 65 20 65 78 70 72 65 73 73 69 6f  priate expressio
132e0 6e 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ns are:.**.**   
132f0 20 2a 20 20 41 6e 79 20 65 78 70 72 65 73 73 69   *  Any expressi
13300 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  on that evaluate
13310 73 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65  s to two or more
13320 20 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20   opcodes..**.** 
13330 20 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74     *  Any OP_Int
13340 65 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f  eger, OP_Real, O
13350 50 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f  P_String, OP_Blo
13360 62 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20  b, OP_Null, .** 
13370 20 20 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69        or OP_Vari
13380 61 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  able that does n
13390 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c  ot need to be pl
133a0 61 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20  aced in a .**   
133b0 20 20 20 20 73 70 65 63 69 66 69 63 20 72 65 67      specific reg
133c0 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ister..**.** The
133d0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
133e0 6e 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20  n factoring out 
133f0 73 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69  single-instructi
13400 6f 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65  on constant.** e
13410 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
13420 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65  need to be place
13430 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d in a particula
13440 72 20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a  r register.  .**
13450 20 57 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72   We could factor
13460 20 74 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74   them out, but t
13470 68 65 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64  hen we would end
13480 20 75 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a   up adding an.**
13490 20 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75   OP_SCopy instru
134a0 63 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68  ction to move th
134b0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  e value into the
134c0 20 63 6f 72 72 65 63 74 20 72 65 67 69 73 74 65   correct registe
134d0 72 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20  r.** later.  We 
134e0 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75  might as well ju
134f0 73 74 20 75 73 65 20 74 68 65 20 6f 72 69 67 69  st use the origi
13500 6e 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nal instruction 
13510 61 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65  and.** avoid the
13520 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74   OP_SCopy..*/.st
13530 61 74 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f  atic int isAppro
13540 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69  priateForFactori
13550 6e 67 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  ng(Expr *p){.  i
13560 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
13570 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
13580 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (p) ){.    retur
13590 6e 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f  n 0;  /* Only co
135a0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
135b0 6e 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ns are appropria
135c0 74 65 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67  te for factoring
135d0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
135e0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78  ->flags & EP_Fix
135f0 65 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20  edDest)==0 ){.  
13600 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
13610 41 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74  Any constant wit
13620 68 6f 75 74 20 61 20 66 69 78 65 64 20 64 65 73  hout a fixed des
13630 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72  tination is appr
13640 6f 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20  opriate */.  }. 
13650 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
13660 4b 5f 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d  K_UPLUS ) p = p-
13670 3e 70 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68  >pLeft;.  switch
13680 28 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64  ( p->op ){.#ifnd
13690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
136a0 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20  LOB_LITERAL.    
136b0 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65  case TK_BLOB:.#e
136c0 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
136d0 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63  _VARIABLE:.    c
136e0 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
136f0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
13700 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
13710 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
13720 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
13730 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13740 3d 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  ==TK_BLOB );.   
13750 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13760 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
13770 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13780 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  e( p->op==TK_INT
13790 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65  EGER );.      te
137a0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
137b0 4b 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20  K_FLOAT );.     
137c0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
137d0 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  ==TK_NULL );.   
137e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
137f0 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b  op==TK_STRING );
13800 0a 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65  .      /* Single
13810 2d 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e  -instruction con
13820 73 74 61 6e 74 73 20 77 69 74 68 20 61 20 66 69  stants with a fi
13830 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  xed destination 
13840 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74  are.      ** bet
13850 74 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65  ter done in-line
13860 2e 20 20 49 66 20 77 65 20 66 61 63 74 6f 72 20  .  If we factor 
13870 74 68 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20  them, they will 
13880 6a 75 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a  just end.      *
13890 2a 20 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20  * up generating 
138a0 61 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d  an OP_SCopy to m
138b0 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ove the value to
138c0 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
138d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74  .      ** regist
138e0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  er. */.      ret
138f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
13900 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
13910 20 7b 0a 20 20 20 20 20 20 20 69 66 28 20 70 2d   {.       if( p-
13920 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46  >pLeft->op==TK_F
13930 4c 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74  LOAT || p->pLeft
13940 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
13950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
13960 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a  urn 0;.       }.
13970 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13980 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
13990 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
139a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
139b0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
139c0 66 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e  f pExpr is a con
139d0 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
139e0 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
139f0 69 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74  iate for.** fact
13a00 6f 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c  oring out of a l
13a10 6f 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61  oop, then evalua
13a20 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
13a30 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  n.** into a regi
13a40 73 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ster and convert
13a50 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13a60 69 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  into a TK_REGIST
13a70 45 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ER.** expression
13a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a90 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 57 61  evalConstExpr(Wa
13aa0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
13ab0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 50  xpr *pExpr){.  P
13ac0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
13ad0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
13ae0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
13af0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
13b00 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
13b10 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13b20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13b30 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
13b40 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
13b50 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
13b60 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 20 7b 0a 20  _CONST_FUNC: {. 
13b70 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75       /* The argu
13b80 6d 65 6e 74 73 20 74 6f 20 61 20 66 75 6e 63 74  ments to a funct
13b90 69 6f 6e 20 68 61 76 65 20 61 20 66 69 78 65 64  ion have a fixed
13ba0 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20   destination..  
13bb0 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 6d      ** Mark them
13bc0 20 74 68 69 73 20 77 61 79 20 74 6f 20 61 76 6f   this way to avo
13bd0 69 64 20 67 65 6e 65 72 61 74 65 64 20 75 6e 6e  id generated unn
13be0 65 65 64 65 64 20 4f 50 5f 53 43 6f 70 79 0a 20  eeded OP_SCopy. 
13bf0 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74       ** instruct
13c00 69 6f 6e 73 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ions. .      */.
13c10 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
13c20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
13c30 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  List;.      if( 
13c40 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
13c50 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
13c60 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 73  nExpr;.        s
13c70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13c80 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 4c 69  tem *pItem = pLi
13c90 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
13ca0 6f 72 28 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  or(; i>0; i--, p
13cb0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
13cc0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45     if( pItem->pE
13cd0 78 70 72 20 29 20 70 49 74 65 6d 2d 3e 70 45 78  xpr ) pItem->pEx
13ce0 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  pr->flags |= EP_
13cf0 46 69 78 65 64 44 65 73 74 3b 0a 20 20 20 20 20  FixedDest;.     
13d00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13d10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13d20 20 20 7d 0a 20 20 69 66 28 20 69 73 41 70 70 72    }.  if( isAppr
13d30 6f 70 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72  opriateForFactor
13d40 69 6e 67 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ing(pExpr) ){.  
13d50 20 20 69 6e 74 20 72 31 20 3d 20 2b 2b 70 50 61    int r1 = ++pPa
13d60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
13d70 6e 74 20 72 32 3b 0a 20 20 20 20 72 32 20 3d 20  nt r2;.    r2 = 
13d80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
13d90 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
13da0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
13db0 28 20 72 31 21 3d 72 32 20 29 20 73 71 6c 69 74  ( r1!=r2 ) sqlit
13dc0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13dd0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
13de0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
13df0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 70  _REGISTER;.    p
13e00 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 72  Expr->iTable = r
13e10 32 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  2;.    return WR
13e20 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
13e30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
13e40 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ue;.}../*.** Pre
13e50 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61 6e  evaluate constan
13e60 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  t subexpressions
13e70 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61 6e   within pExpr an
13e80 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
13e90 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
13ea0 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45 78  ers.  Modify pEx
13eb0 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  pr so that the c
13ec0 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72 65  onstant subexpre
13ed0 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b 5f  sions.** are TK_
13ee0 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65 73  REGISTER opcodes
13ef0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
13f00 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20 76  he precomputed v
13f10 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  alues..*/.void s
13f20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
13f30 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a 70  nstants(Parse *p
13f40 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
13f50 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
13f60 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
13f70 63 6b 20 3d 20 65 76 61 6c 43 6f 6e 73 74 45 78  ck = evalConstEx
13f80 70 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  pr;.  w.xSelectC
13f90 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 77  allback = 0;.  w
13fa0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
13fb0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
13fc0 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
13fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
13fe0 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
13ff0 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
14000 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
14010 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
14020 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
14030 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
14040 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
14050 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
14060 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
14070 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
14080 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
14090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
140a0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
140b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
140c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
140d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
140e0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
140f0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
14100 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
14110 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
14120 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
14130 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
14140 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ults */.  int do
14150 48 61 72 64 43 6f 70 79 20 20 20 20 20 2f 2a 20  HardCopy     /* 
14160 4d 61 6b 65 20 61 20 68 61 72 64 20 63 6f 70 79  Make a hard copy
14170 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
14180 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  t */.){.  struct
14190 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
141a0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
141b0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  n;.  assert( pLi
141c0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
141d0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
141e0 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
141f0 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  r;.  for(pItem=p
14200 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
14210 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
14220 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
14230 3e 69 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >iAlias ){.     
14240 20 69 6e 74 20 69 52 65 67 20 3d 20 63 6f 64 65   int iReg = code
14250 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 49  Alias(pParse, pI
14260 74 65 6d 2d 3e 69 41 6c 69 61 73 2c 20 70 49 74  tem->iAlias, pIt
14270 65 6d 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65  em->pExpr, targe
14280 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+i);.      Vdbe
14290 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
142a0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
142b0 20 20 20 20 69 66 28 20 69 52 65 67 21 3d 74 61      if( iReg!=ta
142c0 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
142d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142e0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
142f0 20 69 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29   iReg, target+i)
14300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
14310 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
14320 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14330 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  e, pItem->pExpr,
14340 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
14350 7d 0a 20 20 20 20 69 66 28 20 64 6f 48 61 72 64  }.    if( doHard
14360 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 73 71  Copy ){.      sq
14370 6c 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70  lite3ExprHardCop
14380 79 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  y(pParse, target
14390 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , n);.    }.  }.
143a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
143b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
143c0 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
143d0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
143e0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
143f0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
14400 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
14410 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
14420 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
14430 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
14440 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
14450 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
14460 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
14470 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
14480 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
14490 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
144a0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
144b0 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
144c0 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
144d0 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
144e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
144f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
14500 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
14510 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
14520 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
14530 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
14540 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
14550 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
14560 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
14570 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
14580 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
14590 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
145a0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
145b0 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
145c0 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
145d0 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
145e0 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
145f0 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
14600 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
14610 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
14620 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
14630 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
14640 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
14650 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
14660 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
14670 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
14680 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
14690 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
146a0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
146b0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
146c0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
146d0 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
146e0 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
146f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
14700 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
14710 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
14720 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
14730 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
14740 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
14750 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
14760 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
14770 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
14780 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14790 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
147a0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
147b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
147c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
147d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
147e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
147f0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
14800 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20  olCache==0 );.  
14810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
14820 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
14830 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
14840 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
14850 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
14860 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
14870 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
14880 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14890 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
148a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
148b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
148c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
148d0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
148e0 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20  olCache>0 );.   
148f0 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
14900 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20  leColCache--;.  
14910 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14920 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
14930 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
14940 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14950 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74  TK_OR: {.      t
14960 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
14970 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
14980 74 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65  testcase( pParse
14990 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
149a0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  e==0 );.      sq
149b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
149c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
149d0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
149e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70  IfNull);.      p
149f0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14a00 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
14a10 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
14a20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
14a30 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
14a40 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
14a50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14a60 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14a70 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  e>0 );.      pPa
14a80 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14a90 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72  ache--;.      br
14aa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14ab0 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
14ac0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
14ad0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
14ae0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14af0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
14b00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
14b10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
14b20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14b30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14b40 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
14b50 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
14b60 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
14b70 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
14b80 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
14b90 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
14ba0 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
14bb0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14bc0 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
14bd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14be0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
14bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14c00 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
14c10 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
14c20 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
14c30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
14c40 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
14c50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
14c60 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
14c70 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
14c80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14c90 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
14ca0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14cb0 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
14cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14cd0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
14ce0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
14cf0 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_NE );.      te
14d00 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
14d10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ll==0 );.      c
14d20 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e  odeCompareOperan
14d30 64 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ds(pParse, pExpr
14d40 2d 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72  ->pLeft, &r1, &r
14d50 65 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20  egFree1,.       
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
14d80 2d 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26  ->pRight, &r2, &
14d90 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
14da0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14db0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
14dc0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
14dd0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
14de0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
14df0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
14e00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14e10 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14e20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14e30 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14e40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14e50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
14e60 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
14e70 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
14e80 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
14e90 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
14ea0 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
14eb0 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
14ec0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
14ed0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
14ee0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =TK_ISNULL );.  
14ef0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
14f00 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
14f10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14f20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
14f30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14f40 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
14f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14f60 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
14f70 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
14f80 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14f90 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14fa0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14fb0 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
14fc0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20  : {.      /*    
14fd0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
14fe0 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  z.      **.     
14ff0 20 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e   ** Is equivalen
15000 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20  t to .      **. 
15010 20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20       **    x>=y 
15020 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a  AND x<=z.      *
15030 2a 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20  *.      ** Code 
15040 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69  it as such, taki
15050 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68  ng care to do th
15060 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72  e common subexpr
15070 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
15080 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  elementation of 
15090 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
150a0 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a    Expr exprAnd;.
150b0 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c        Expr compL
150c0 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
150d0 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20  compRight;.     
150e0 20 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20   Expr exprX;..  
150f0 20 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78      exprX = *pEx
15100 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
15110 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
15120 5f 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72  _AND;.      expr
15130 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
15140 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
15150 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
15160 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
15170 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b  compLeft.op = TK
15180 5f 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c  _GE;.      compL
15190 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
151a0 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  rX;.      compLe
151b0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
151c0 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
151d0 45 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70  Expr;.      comp
151e0 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45  Right.op = TK_LE
151f0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
15200 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
15210 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
15220 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
15230 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
15240 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58  xpr;.      exprX
15250 2e 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  .iTable = sqlite
15260 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15270 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
15280 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
15290 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
152a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65  e1==0 );.      e
152b0 78 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  xprX.op = TK_REG
152c0 49 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73  ISTER;.      tes
152d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
152e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
152f0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
15300 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
15310 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15320 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
15330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
15340 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20  ult: {.      r1 
15350 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15360 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
15370 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
15380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15390 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
153a0 66 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d  f, r1, dest, jum
153b0 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20  pIfNull!=0);.   
153c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
153d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
153e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
153f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
15400 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
15420 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15430 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
15440 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15450 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15460 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
15470 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
15480 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
15490 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
154a0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
154b0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
154c0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
154d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
154e0 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
154f0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
15500 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
15510 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
15520 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
15530 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
15540 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
15550 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
15560 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
15570 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
15580 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
15590 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
155a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
155b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
155c0 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
155d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
155e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
155f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
15600 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
15610 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
15620 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15630 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
15640 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
15650 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
15660 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
15670 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
15680 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
15690 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
156a0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
156b0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  );.  if( v==0 ||
156c0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
156d0 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
156e0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
156f0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
15700 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
15710 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
15720 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
15730 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
15740 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
15750 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
15760 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
15770 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
15780 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
15790 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
157a0 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
157b0 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
157c0 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
157d0 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
157e0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
157f0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
15800 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
15810 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
15820 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
15830 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
15840 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
15850 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
15860 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
15870 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
15880 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
15890 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
158a0 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
158b0 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
158c0 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
158d0 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
158e0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
158f0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
15900 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
15910 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
15920 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
15930 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
15940 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
15950 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
15960 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
15970 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
15980 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
15990 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
159a0 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
159b0 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
159c0 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
159d0 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
159e0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
159f0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
15a00 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
15a10 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
15a20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
15a30 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
15a40 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
15a50 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
15a60 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
15a70 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
15a80 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
15a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
15aa0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
15ab0 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
15ac0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
15ad0 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
15ae0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
15af0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
15b00 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
15b10 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
15b20 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
15b30 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
15b40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
15b50 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
15b60 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
15b70 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
15b80 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
15b90 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ND: {.      test
15ba0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
15bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
15bc0 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64  tcase( pParse->d
15bd0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d  isableColCache==
15be0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
15bf0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
15c00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15c10 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
15c20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61  Null);.      pPa
15c30 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
15c40 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ache++;.      sq
15c50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
15c60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15c70 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
15c80 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
15c90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
15ca0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15cb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
15cc0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15cd0 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65  che--;.      bre
15ce0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15cf0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
15d00 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
15d10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15d20 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
15d30 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
15d40 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
15d50 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ase( pParse->dis
15d60 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20  ableColCache==0 
15d70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15d80 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
15d90 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15da0 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
15db0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
15dc0 4c 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  L);.      pParse
15dd0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
15de0 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e++;.      sqlit
15df0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
15e00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
15e10 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
15e20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
15e30 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
15e40 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20  sableColCache>0 
15e50 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
15e60 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
15e70 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  --;.      sqlite
15e80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15e90 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
15ea0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15eb0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
15ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15ed0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
15ee0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
15ef0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
15f00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15f10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
15f20 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
15f30 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
15f40 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
15f50 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
15f60 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
15f70 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
15f80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20  case( op==TK_LT 
15f90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15fa0 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  e( op==TK_LE );.
15fb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15fc0 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20  op==TK_GT );.   
15fd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
15fe0 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
15ff0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16000 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _EQ );.      tes
16010 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45  tcase( op==TK_NE
16020 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16030 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
16040 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  0 );.      codeC
16050 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70  ompareOperands(p
16060 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16070 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72  eft, &r1, &regFr
16080 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ee1,.           
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52         pExpr->pR
160b0 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46  ight, &r2, &regF
160c0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
160d0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
160e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
160f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
16100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16110 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
16120 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
16130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16140 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
16150 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16160 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16180 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
16190 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
161a0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
161b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
161c0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
161d0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
161e0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
161f0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16200 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16210 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16220 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
16230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16240 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
16250 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
16260 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16270 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
16280 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16290 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
162a0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20  {.      /*    x 
162b0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
162c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
162d0 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * Is equivalent 
162e0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  to .      **.   
162f0 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
16300 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a  D x<=z.      **.
16310 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74        ** Code it
16320 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
16330 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
16340 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
16350 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c  sion.      ** el
16360 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e  ementation of x.
16370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16380 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20  Expr exprAnd;.  
16390 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66      Expr compLef
163a0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f  t;.      Expr co
163b0 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45  mpRight;.      E
163c0 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20  xpr exprX;..    
163d0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
163e0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65  ->pLeft;.      e
163f0 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
16400 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ND;.      exprAn
16410 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
16420 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41  eft;.      exprA
16430 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d  nd.pRight = &com
16440 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f  pRight;.      co
16450 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
16460 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  E;.      compLef
16470 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
16480 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
16490 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
164a0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
164b0 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69  pr;.      compRi
164c0 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
164d0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
164e0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
164f0 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e        compRight.
16500 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
16510 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
16520 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69  r;.      exprX.i
16530 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45  Table = sqlite3E
16540 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16550 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67  se, &exprX, &reg
16560 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
16570 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16580 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
16590 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  rX.op = TK_REGIS
165a0 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63  TER;.      testc
165b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
165c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
165d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
165e0 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
165f0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
16600 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
16610 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
16620 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
16630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16640 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16650 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
16660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16670 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
16680 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a  Not, r1, dest, j
16690 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20  umpIfNull!=0);. 
166a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
166b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
166c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
166d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
166e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
166f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
16700 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16710 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
16720 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
16730 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16740 20 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f   regFree2);.}../
16750 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
16760 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
16770 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
16780 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
16790 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
167a0 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
167b0 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
167c0 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
167d0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
167e0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
167f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
16800 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65  l return FALSE e
16810 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65  ven if the two e
16820 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65  xpressions.** re
16830 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c  ally are equival
16840 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e  ent.  If we cann
16850 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  ot prove that th
16860 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
16870 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20  e.** identical, 
16880 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20  we return FALSE 
16890 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
168a0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
168b0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
168c0 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20  false, then you 
168d0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
168e0 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
168f0 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
16900 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
16910 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
16920 6f 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65  ou get a TRUE re
16930 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
16940 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
16950 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
16960 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
16970 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
16980 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
16990 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
169a0 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
169b0 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45  t an extra FALSE
169c0 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
169d0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
169e0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
169f0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
16a00 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
16a10 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63  incorrect TRUE c
16a20 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
16a30 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
16a40 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
16a50 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
16a60 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
16a70 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c   i;.  if( pA==0|
16a80 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  |pB==0 ){.    re
16a90 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d  turn pB==pA;.  }
16aa0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
16ab0 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
16ac0 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  ;.  if( (pA->fla
16ad0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
16ae0 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
16af0 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
16b00 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
16b10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
16b20 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
16b30 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
16b40 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
16b50 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
16b60 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
16b70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
16b80 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
16b90 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
16ba0 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
16bb0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
16bc0 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
16bd0 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
16be0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
16bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
16c00 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
16c10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
16c20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
16c30 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
16c40 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
16c50 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
16c60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16c70 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
16c80 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
16c90 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
16ca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16cb0 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
16cc0 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
16cd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16ce0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
16cf0 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
16d00 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
16d10 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
16d20 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
16d30 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  K_COLUMN && pA->
16d40 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
16d50 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
16d60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16d70 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
16d80 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
16d90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
16da0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
16db0 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f  mp((char*)pA->to
16dc0 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d  ken.z,(char*)pB-
16dd0 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b  >token.z,pB->tok
16de0 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  en.n)!=0 ){.    
16df0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
16e00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
16e10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
16e20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
16e30 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
16e40 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
16e50 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
16e60 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
16e70 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
16e80 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
16e90 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
16ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16eb0 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
16ec0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
16ed0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
16ee0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
16ef0 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
16f00 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
16f10 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
16f20 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
16f30 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
16f40 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
16f50 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e    3,.       &pIn
16f60 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20  fo->nColumn,.   
16f70 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
16f80 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20  umnAlloc,.      
16f90 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
16fa0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
16fb0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
16fc0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
16fd0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
16fe0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
16ff0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
17000 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
17010 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
17020 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
17030 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
17040 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
17050 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
17060 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
17070 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
17080 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
17090 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
170a0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
170b0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
170c0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
170d0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
170e0 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20  ]),.       3,.  
170f0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
17100 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  nc,.       &pInf
17110 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20  o->nFuncAlloc,. 
17120 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
17130 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
17140 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
17150 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  he xExprCallback
17160 20 66 6f 72 20 61 20 74 72 65 65 20 77 61 6c 6b   for a tree walk
17170 65 72 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  er.  It is used 
17180 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
17190 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
171a0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
171b0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
171c0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
171d0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
171e0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
171f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17200 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
17210 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
17220 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
17230 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
17240 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70 57 61  ntext *pNC = pWa
17250 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50  lker->u.pNC;.  P
17260 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
17270 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
17280 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
17290 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
172a0 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
172b0 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
172c0 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
172d0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
172e0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
172f0 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
17300 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
17310 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
17320 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
17330 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
17340 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
17350 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
17360 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
17370 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
17380 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
17390 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
173a0 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
173b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
173c0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
173d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  /.      if( pSrc
173e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
173f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17400 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
17410 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
17420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
17430 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
17440 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
17450 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
17460 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
17470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
17480 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
17490 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
174a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
174b0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
174c0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
174d0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
174e0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
174f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
17500 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
17510 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
17520 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
17530 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
17540 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
17550 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
17560 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
17570 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
17580 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
17590 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
175a0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
175b0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
175c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
175d0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
175e0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
175f0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
17600 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
17610 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
17620 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
17630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17640 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
17650 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
17660 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
17670 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
17680 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
17690 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
176a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
176b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
176c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
176d0 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
176e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
176f0 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
17700 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
17710 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
17720 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
17730 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
17740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17750 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
17760 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
17770 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
17780 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
17790 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
177a0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
177b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
177d0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
177e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
177f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
17800 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
17810 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
17820 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
17830 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
17840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
17850 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
17860 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
17870 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
17880 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
17890 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
178a0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
178b0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
178c0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
178d0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
178e0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
178f0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17900 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
17950 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
17970 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
17980 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
17990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
179a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
179b0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
179c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
179f0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
17a00 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
17a10 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
17a20 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
17a30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
17a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
17a80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
17a90 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
17aa0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
17ac0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
17ad0 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
17ae0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
17b00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17b20 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
17b30 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
17b40 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
17b50 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
17b60 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
17b70 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
17b80 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
17b90 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
17ba0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
17bb0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
17bc0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
17bd0 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
17be0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
17bf0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
17c00 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
17c10 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
17c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
17c30 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
17c40 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
17c50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
17c60 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
17c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
17c80 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20  xpr->iAgg = k;. 
17c90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
17cb0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
17cc0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
17cd0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
17ce0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
17cf0 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
17d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
17d10 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
17d20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17d30 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
17d40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
17d50 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
17d60 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
17d70 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
17d80 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
17d90 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
17da0 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
17db0 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
17dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
17dd0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
17de0 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
17df0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
17e00 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
17e10 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
17e20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
17e30 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
17e40 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
17e50 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
17e60 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
17e70 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
17e80 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
17e90 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
17ea0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
17eb0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
17ec0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
17ed0 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
17ee0 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
17ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
17f00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
17f10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17f20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
17f30 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
17f40 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
17f50 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
17f60 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
17f70 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
17f80 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
17f90 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
17fa0 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
17fb0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  db);.          i
17fc0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
17fd0 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  c(pParse->db, pA
17fe0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
17ff0 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
18000 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
18010 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
18020 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
18030 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
18040 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
18050 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
18060 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
18070 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
18080 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
18090 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
180a0 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
180d0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
180e0 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
180f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
18100 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
18110 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
18120 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
18130 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
18140 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
18150 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
18160 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
18170 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
18180 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
18190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
181b0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
181c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
181d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
181e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
181f0 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
18200 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
18210 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
18220 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
18230 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18240 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
18250 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
18260 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
18270 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
18280 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
18290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
182a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
182b0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
182c0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
182d0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
182e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
182f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
18300 74 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  t){.  NameContex
18310 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
18320 2d 3e 75 2e 70 4e 43 3b 0a 20 20 69 66 28 20 70  ->u.pNC;.  if( p
18330 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
18340 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
18350 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ++;.    sqlite3W
18360 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
18370 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  r, pSelect);.   
18380 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
18390 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
183a0 72 75 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rune;.  }else{. 
183b0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
183c0 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ntinue;.  }.}../
183d0 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
183e0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
183f0 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
18400 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
18410 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
18420 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
18430 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
18440 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
18450 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
18460 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
18470 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
18480 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
18490 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
184a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
184b0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
184c0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
184d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
184e0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
184f0 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
18500 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
18510 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18520 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
18530 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
18540 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
18550 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
18560 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
18570 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
18580 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
18590 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
185a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
185b0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e  Select;.  w.u.pN
185c0 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74  C = pNC;.  sqlit
185d0 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
185e0 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
185f0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
18600 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
18610 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
18620 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
18630 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
18640 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
18650 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
18660 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
18670 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
18680 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
18690 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
186a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
186b0 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
186c0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
186d0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
186e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
186f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
18700 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
18710 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
18720 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
18730 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
18740 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
18760 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
18770 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
18780 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
18790 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
187a0 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
187b0 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65 20  e temporary use 
187c0 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e 67  registers during
187d0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
187e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
187f0 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
18800 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
18810 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
18820 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
18830 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
18840 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
18850 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
18860 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
18870 52 65 67 5d 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  Reg];.}.void sql
18880 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18890 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
188a0 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
188b0 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
188c0 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
188d0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
188e0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 73  empReg) ){.    s
188f0 71 6c 69 74 65 33 45 78 70 72 57 72 69 74 61 62  qlite3ExprWritab
18900 6c 65 52 65 67 69 73 74 65 72 28 70 50 61 72 73  leRegister(pPars
18910 65 2c 20 69 52 65 67 2c 20 69 52 65 67 29 3b 0a  e, iReg, iReg);.
18920 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
18930 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
18940 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
18950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
18960 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
18970 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
18980 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
18990 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
189a0 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
189b0 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
189c0 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
189d0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
189e0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
189f0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
18a00 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
18a10 69 66 28 20 6e 52 65 67 3c 3d 6e 20 26 26 20 21  if( nReg<=n && !
18a20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
18a30 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
18a40 2d 31 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  -1) ){.    pPars
18a50 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
18a60 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
18a70 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
18a80 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
18a90 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
18aa0 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
18ab0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
18ac0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
18ad0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
18ae0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
18af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
18b00 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
18b10 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  ){.  if( nReg>pP
18b20 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
18b30 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
18b40 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
18b50 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
18b60 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
18b70 20 7d 0a 7d 0a                                    }.}.