/ Hex Artifact Content
Login

Artifact 9ce4f2585325bf3550d24fe60883a87263e0f630:


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 35 20 32 30 30 38 2f 31 32 2f 30 35 20  .405 2008/12/05 
0220: 31 35 3a 32 34 3a 31 37 20 64 72 68 20 45 78 70  15:24:17 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 61 41 6c   if( pParse->aAl
d830: 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ias==0 ){.    pP
d840: 61 72 73 65 2d 3e 61 41 6c 69 61 73 20 3d 20 73  arse->aAlias = s
d850: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
d860: 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  ro(db, .        
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
d890: 70 50 61 72 73 65 2d 3e 61 41 6c 69 61 73 5b 30  pParse->aAlias[0
d8a0: 5d 29 2a 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  ])*pParse->nAlia
d8b0: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  s );.    if( db-
d8c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
d8d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d8e0: 61 73 73 65 72 74 28 20 69 41 6c 69 61 73 3e 30  assert( iAlias>0
d8f0: 20 26 26 20 69 41 6c 69 61 73 3c 3d 70 50 61 72   && iAlias<=pPar
d900: 73 65 2d 3e 6e 41 6c 69 61 73 20 29 3b 0a 20 20  se->nAlias );.  
d910: 69 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  iReg = pParse->a
d920: 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d 31 5d 3b  Alias[iAlias-1];
d930: 0a 20 20 69 66 28 20 69 52 65 67 3d 3d 30 20 29  .  if( iReg==0 )
d940: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
d950: 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
d960: 65 20 29 7b 0a 20 20 20 20 20 20 69 52 65 67 20  e ){.      iReg 
d970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
d980: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
d990: 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
d9a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d9b0: 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65   iReg = ++pParse
d9c0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
d9d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d9e0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 69 52 65  arse, pExpr, iRe
d9f0: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  g);.      pParse
da00: 2d 3e 61 41 6c 69 61 73 5b 69 41 6c 69 61 73 2d  ->aAlias[iAlias-
da10: 31 5d 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 7d  1] = iReg;.    }
da20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
da30: 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  eg;.}../*.** Gen
da40: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
da50: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
da60: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
da70: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
da80: 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
da90: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
daa0: 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
dab0: 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
dac0: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
dad0: 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
dae0: 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
daf0: 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
db00: 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
db10: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
db20: 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
db30: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
db40: 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
db50: 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
db60: 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
db70: 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
db80: 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
db90: 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
dba0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
dbb0: 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
dbc0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
dbd0: 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
dbe0: 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
dbf0: 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
dc00: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
dc10: 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
dc20: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
dc30: 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
dc40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
dc50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
dc60: 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
dc70: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
dc80: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
dc90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dca0: 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
dcb0: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
dcc0: 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
dcd0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
dce0: 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
dcf0: 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
dd00: 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
dd10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
dd20: 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
dd30: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
dd40: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
dd50: 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
dd60: 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
dd70: 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
dd80: 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
dd90: 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
dda0: 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
ddb0: 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
ddc0: 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
ddd0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 64 62  lite3 *db;..  db
dde0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ddf0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 7c 7c   assert( v!=0 ||
de00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
de10: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  d );.  assert( t
de20: 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
de30: 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
de40: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
de50: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66 28  return 0;..  if(
de60: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
de70: 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20   op = TK_NULL;. 
de80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
de90: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a   pExpr->op;.  }.
dea0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
deb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
dec0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
ded0: 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
dee0: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
def0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
df00: 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
df10: 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
df20: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
df30: 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
df40: 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
df50: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ode ){.        a
df60: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65  ssert( pCol->iMe
df70: 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  m>0 );.        i
df80: 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65  nReg = pCol->iMe
df90: 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  m;.        break
dfa0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
dfb0: 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53  ( pAggInfo->useS
dfc0: 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20  ortingIdx ){.   
dfd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dfe0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
dff0: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
e000: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
e030: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
e040: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
e050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e060: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
e070: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
e080: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
e090: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
e0a0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
e0b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
e0c0: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
e0d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
e0e0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
e0f0: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
e100: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
e110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
e120: 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
e130: 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
e140: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
e150: 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
e160: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
e170: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
e180: 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
e190: 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d 30 20  & EP_AnyAff)!=0 
e1a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
e1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e1c0: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
e1d0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
e1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
e210: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
e220: 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
e250: 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e 79 41  >flags & EP_AnyA
e260: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
e270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e280: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
e290: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
e2a0: 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70  eInteger(v, pExp
e2b0: 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
e2c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e2d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
e2e0: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  OAT: {.      cod
e2f0: 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
e300: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
e310: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
e320: 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
e330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e340: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
e350: 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
e360: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64 62  e3DequoteExpr(db
e370: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
e380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e390: 34 28 76 2c 4f 50 5f 53 74 72 69 6e 67 38 2c 20  4(v,OP_String8, 
e3a0: 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 0a 20 20  0, target, 0,.  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
e3d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
e3e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
e3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e400: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
e410: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
e420: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e430: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
e440: 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
e450: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
e460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
e470: 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
e480: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
e490: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
e4a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
e4b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
e4c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e4d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 3d  pExpr->token.n>=
e4e0: 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
e4f0: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
e500: 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  z[0]=='x' || pEx
e510: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
e520: 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
e530: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
e540: 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  n.z[1]=='\'' );.
e550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e560: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78  xpr->token.z[pEx
e570: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d  pr->token.n-1]==
e580: 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 6e 20  '\'' );.      n 
e590: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
e5a0: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
e5b0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
e5c0: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
e5d0: 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   zBlob = sqlite3
e5e0: 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65  HexToBlob(sqlite
e5f0: 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e  3VdbeDb(v), z, n
e600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e610: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
e620: 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67  _Blob, n/2, targ
e630: 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34  et, 0, zBlob, P4
e640: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
e650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
e660: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
e670: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
e680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e690: 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
e6a0: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ble, pExpr->iTab
e6b0: 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  le, target);.   
e6c0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
e6d0: 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20  ken.n>1 ){.     
e6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e6f0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
e700: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
e710: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
e720: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n.n);.      }.  
e730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e740: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
e750: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  ISTER: {.      i
e760: 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54  nReg = pExpr->iT
e770: 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  able;.      brea
e780: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e790: 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
e7a0: 20 69 6e 52 65 67 20 3d 20 63 6f 64 65 41 6c 69   inReg = codeAli
e7b0: 61 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  as(pParse, pExpr
e7c0: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
e7d0: 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
e7e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e7f0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e800: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
e810: 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
e820: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
e830: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
e840: 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
e850: 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
e860: 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
e870: 70 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  p;.      inReg =
e880: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e890: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
e8a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
e8b0: 67 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20  get);.      aff 
e8c0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
e8d0: 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f  yType(&pExpr->to
e8e0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f  ken);.      to_o
e8f0: 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45  p = aff - SQLITE
e900: 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54  _AFF_TEXT + OP_T
e910: 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  oText;.      ass
e920: 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
e930: 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21  oText    || aff!
e940: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
e950: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
e960: 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
e970: 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
e980: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
e990: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
e9a0: 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
e9b0: 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21  oNumeric || aff!
e9c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
e9d0: 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73  RIC );.      ass
e9e0: 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
e9f0: 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21  oInt     || aff!
ea00: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
ea10: 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
ea20: 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ert( to_op==OP_T
ea30: 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21  oReal    || aff!
ea40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
ea50: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73      );.      tes
ea60: 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50  tcase( to_op==OP
ea70: 5f 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20  _ToText );.     
ea80: 20 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70   testcase( to_op
ea90: 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20  ==OP_ToBlob );. 
eaa0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
eab0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
eac0: 69 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ic );.      test
ead0: 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
eae0: 54 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  ToInt );.      t
eaf0: 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d  estcase( to_op==
eb00: 4f 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20  OP_ToReal );.   
eb10: 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
eb20: 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
eb30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eb40: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
eb50: 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
eb60: 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
eb70: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
eb80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eb90: 41 64 64 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c  AddOp1(v, to_op,
eba0: 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 74   inReg);.      t
ebb0: 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
ebc0: 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
ebd0: 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
ebe0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ebf0: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
ec00: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
ec10: 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
ec20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ec30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ec40: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
ec50: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
ec60: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
ec70: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
ec80: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
ec90: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
eca0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
ecb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ecc0: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
ecd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
ece0: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
ecf0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
ed00: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
ed10: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
ed20: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
ed30: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
ed40: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
ed50: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
ed60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ed70: 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  e( op==TK_LT );.
ed80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ed90: 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20  op==TK_LE );.   
eda0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
edb0: 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  =TK_GT );.      
edc0: 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
edd0: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GE );.      tes
ede0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51  tcase( op==TK_EQ
edf0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ee00: 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  se( op==TK_NE );
ee10: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
ee20: 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
ee30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
ee40: 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
ee50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
ee80: 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
ee90: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
eea0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
eeb0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
eec0: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53  r1, r2, inReg, S
eef0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
ef00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ef10: 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
ef20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
ef30: 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
ef40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ef50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
ef60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
ef70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
ef80: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
ef90: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
efa0: 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
efb0: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
efc0: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
efd0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
efe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
eff0: 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
f000: 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
f010: 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
f020: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
f030: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
f040: 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
f050: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f060: 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
f070: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f080: 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
f090: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f0a0: 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
f0b0: 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
f0c0: 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
f0d0: 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
f0e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f0f0: 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
f100: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
f110: 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
f120: 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
f130: 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
f140: 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
f150: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
f160: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
f170: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
f180: 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
f190: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
f1a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f1b0: 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
f1c0: 63 61 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  cat );.      tes
f1d0: 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
f1e0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
f1f0: 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
f200: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f210: 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b  ( op==TK_PLUS );
f220: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f230: 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
f240: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f250: 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20   op==TK_REM );. 
f260: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f270: 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
f280: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f290: 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
f2a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f2b0: 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
f2c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f2d0: 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b  op==TK_LSHIFT );
f2e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f2f0: 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
f300: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f310: 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
f320: 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
f330: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
f340: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
f350: 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
f360: 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
f370: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
f380: 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
f390: 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
f3a0: 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
f3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f3c0: 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
f3d0: 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
f3e0: 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
f3f0: 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
f400: 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
f410: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
f420: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f430: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
f440: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
f450: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
f460: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
f470: 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
f480: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
f490: 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
f4a0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
f4b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
f4c0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  ){.          cod
f4e0: 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29  eReal(v, (char*)
f4f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pLeft->token.z, 
f500: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pLeft->token.n, 
f510: 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
f520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f530: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
f540: 28 76 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  (v, pLeft, 1, ta
f550: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
f560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f570: 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
f580: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f590: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f5a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f5b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f5c0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31 29  _Integer, 0, r1)
f5d0: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
f5e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
f5f0: 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
f600: 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
f610: 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e2);.        sql
f620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f630: 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
f640: 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
f650: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
f660: 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
f670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f680: 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20  nReg = target;. 
f690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f6a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
f6b0: 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
f6c0: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
f6d0: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
f6e0: 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
f6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f700: 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
f710: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
f720: 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
f730: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f740: 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
f750: 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
f760: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
f770: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
f780: 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
f790: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f7a0: 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74 20 29   inReg==target )
f7b0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f7c0: 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
f7d0: 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
f7e0: 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
f7f0: 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
f800: 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52 65  e3ExprWritableRe
f810: 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 69  gister(pParse, i
f820: 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
f830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f840: 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 69 6e  AddOp1(v, op, in
f850: 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
f860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f870: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
f880: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
f890: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
f8a0: 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
f8b0: 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
f8c0: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
f8d0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
f8e0: 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
f8f0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
f900: 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
f910: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f920: 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
f930: 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
f940: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f950: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
f960: 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31  arget);.      r1
f970: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
f980: 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
f990: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
f9a0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
f9b0: 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
f9c0: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  1==0 );.      ad
f9d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f9e0: 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31  AddOp1(v, op, r1
f9f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa10: 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
fa20: 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   -1);.      sqli
fa30: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fa40: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
fa50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fa60: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
fa70: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
fa80: 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
fa90: 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
faa0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
fab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
fac0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fad0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
fae0: 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
faf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
fb00: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
fb10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb20: 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d    inReg = pInfo-
fb30: 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41  >aFunc[pExpr->iA
fb40: 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  gg].iMem;.      
fb50: 7d 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 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
fb80: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
fb90: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
fba0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
fbb0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
fbc0: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
fbd0: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
fbe0: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
fbf0: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
fc00: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
fc10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
fc20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
fc30: 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  tMask = 0;.     
fc40: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38   int i;.      u8
fc50: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
fc60: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
fc70: 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Coll = 0;..     
fc80: 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
fc90: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a  K_CONST_FUNC );.
fca0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fcb0: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
fcc0: 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  );.      zId = (
fcd0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
fce0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
fcf0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
fd00: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
fd10: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
fd20: 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
fd30: 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
fd40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fd50: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
fd60: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
fd70: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69       nExpr = pLi
fd80: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
fd90: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
fda0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
fdb0: 73 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20  se, nExpr);.    
fdc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fdd0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
fde0: 73 65 2c 20 70 4c 69 73 74 2c 20 72 31 2c 20 31  se, pList, r1, 1
fdf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fe00: 20 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20          nExpr = 
fe10: 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  r1 = 0;.      }.
fe20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe30: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fe40: 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62  .      /* Possib
fe50: 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20  ly overload the 
fe60: 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20  function if the 
fe70: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
fe80: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72  s.      ** a vir
fe90: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d  tual table colum
fea0: 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  n..      **.    
feb0: 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66    ** For infix f
fec0: 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20  unctions (LIKE, 
fed0: 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e  GLOB, REGEXP, an
fee0: 64 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65  d MATCH) use the
fef0: 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
ff00: 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74   argument, not t
ff10: 68 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65  he first, as the
ff20: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73   argument to tes
ff30: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  t to.      ** se
ff40: 65 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c  e if it is a col
ff50: 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c  umn in a virtual
ff60: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
ff70: 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20   done because.  
ff80: 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20      ** the left 
ff90: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78  operand of infix
ffa0: 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20   functions (the 
ffb0: 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20  operand we want 
ffc0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  to.      ** cont
ffd0: 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29  rol overloading)
ffe0: 20 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20   ends up as the 
fff0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10000 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
10010 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65  function.  The e
10020 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f  xpression "A glo
10030 62 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65  b B" is equivale
10040 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  nt to .      ** 
10050 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20  "glob(B,A).  We 
10060 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20  want to use the 
10070 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  A in "A glob B" 
10080 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a  to test.      **
10090 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76   for function ov
100a0 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20  erloading.  But 
100b0 77 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72  we use the B ter
100c0 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22  m in "glob(B,A)"
100d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
100e0 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26   if( nExpr>=2 &&
100f0 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
10100 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29   EP_InfixFunc) )
10110 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
10120 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
10130 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
10140 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c   pDef, nExpr, pL
10150 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
10160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10170 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20  ( nExpr>0 ){.   
10180 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
10190 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
101a0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
101b0 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
101c0 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
101d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
101e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
101f0 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
10200 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
10210 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
10220 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
10230 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
10240 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
10250 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
10260 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
10270 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51  pDef->flags & SQ
10280 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
10290 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
102a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
102b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
102c0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
102d0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
102e0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
102f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10300 20 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53   pDef->flags & S
10310 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
10320 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  OLL ){.        i
10330 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
10340 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
10350 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
10360 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10370 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
10380 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
10390 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
103a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
103b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
103c0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
103d0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
103e0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
10410 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
10420 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10430 67 65 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a  geP5(v, nExpr);.
10440 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 20        if( nExpr 
10450 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10460 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
10470 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
10480 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
10490 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
104a0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
104b0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
104c0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  nExpr);.      br
104d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
104e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
104f0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
10500 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
10510 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
10520 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
10530 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
10540 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10550 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
10560 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
10570 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
10580 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10590 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
105a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
105b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
105c0 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
105d0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
105e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
105f0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
10600 0a 20 20 20 20 20 20 69 6e 74 20 72 4e 6f 74 46  .      int rNotF
10610 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  ound = 0;.      
10620 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  int rMayHaveNull
10630 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
10640 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a  j2, j3, j4, j5;.
10650 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
10660 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 65  ity;.      int e
10670 54 79 70 65 3b 0a 0a 20 20 20 20 20 20 56 64 62  Type;..      Vdb
10680 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
10690 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 20   "begin IN expr 
106a0 72 25 64 22 2c 20 74 61 72 67 65 74 29 29 3b 0a  r%d", target));.
106b0 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71        eType = sq
106c0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
106d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
106e0 26 72 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a  &rMayHaveNull);.
106f0 20 20 20 20 20 20 69 66 28 20 72 4d 61 79 48 61        if( rMayHa
10700 76 65 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  veNull ){.      
10710 20 20 72 4e 6f 74 46 6f 75 6e 64 20 3d 20 2b 2b    rNotFound = ++
10720 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10730 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10740 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
10750 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
10760 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
10770 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
10780 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
10790 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
107a0 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
107b0 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
107c0 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
107d0 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61    ** P4 of OP_Ma
107e0 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
107f0 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
10800 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
10810 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
10820 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
10830 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
10840 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
10850 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  . The temporary 
10860 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70  table.      ** p
10870 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e  Expr->iTable con
10880 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
10890 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
108a0 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20  e (...) set..   
108b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72     */.      pPar
108c0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
108d0 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
108e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
108f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
10900 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
10910 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
10920 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20  eColCache--;.   
10930 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
10940 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10950 49 73 4e 75 6c 6c 2c 20 74 61 72 67 65 74 29 3b  IsNull, target);
10960 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
10970 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
10980 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 33 20 3d   ){.        j3 =
10990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109a0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
109b0 6e 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  nt, target);.   
109c0 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65       j4 = sqlite
109d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
109e0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78  P_NotExists, pEx
109f0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 74  pr->iTable, 0, t
10a00 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
10a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10a30 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
10a40 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
10a50 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10a60 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20  P_Goto);.       
10a70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10a80 48 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20  Here(v, j3);.   
10a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10aa0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b  JumpHere(v, j4);
10ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10ac0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10ad0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
10ae0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  get);.      }els
10af0 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  e{.        r2 = 
10b00 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69 74  regFree2 = sqlit
10b10 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10b20 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rse);..        /
10b30 2a 20 43 72 65 61 74 65 20 61 20 72 65 63 6f 72  * Create a recor
10b40 64 20 61 6e 64 20 74 65 73 74 20 66 6f 72 20 73  d and test for s
10b50 65 74 20 6d 65 6d 62 65 72 73 68 69 70 2e 20 49  et membership. I
10b60 66 20 74 68 65 20 73 65 74 20 63 6f 6e 74 61 69  f the set contai
10b70 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ns.        ** th
10b80 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  e value, then ju
10b90 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
10ba0 20 74 68 65 20 74 65 73 74 20 63 6f 64 65 2e 20   the test code. 
10bb0 54 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 20  The target.     
10bc0 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20 73     ** register s
10bd0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  till contains th
10be0 65 20 74 72 75 65 20 28 31 29 20 76 61 6c 75 65  e true (1) value
10bf0 20 77 72 69 74 74 65 6e 20 74 6f 20 69 74 20 65   written to it e
10c00 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 20 20  arlier..        
10c10 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
10c20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10c30 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 74  OP_MakeRecord, t
10c40 61 72 67 65 74 2c 20 31 2c 20 72 32 2c 20 26 61  arget, 1, r2, &a
10c50 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
10c60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
10c80 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29  eger, 1, target)
10c90 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20 73  ;.        j5 = s
10ca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10cb0 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
10cc0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
10cd0 72 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r2);..        /*
10ce0 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62   If the set memb
10cf0 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c  ership test fail
10d00 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
10d10 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  lt of the .     
10d20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e     ** "x IN (...
10d30 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  )" expression mu
10d40 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f  st be either 0 o
10d50 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  r NULL. If the s
10d60 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  et.        ** co
10d70 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76  ntains no NULL v
10d80 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20  alues, then the 
10d90 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20  result is 0. If 
10da0 74 68 65 20 73 65 74 20 0a 20 20 20 20 20 20 20  the set .       
10db0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
10dc0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
10dd0 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
10de0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
10df0 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
10e00 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  on is also NULL.
10e10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10e20 20 20 20 20 69 66 28 20 72 4e 6f 74 46 6f 75 6e      if( rNotFoun
10e30 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
10e40 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
10e50 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
10e60 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
10e70 74 69 6d 65 20 28 6e 6f 77 29 20 74 68 61 74 20  time (now) that 
10e80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
10e90 65 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e  e set contains n
10ea0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54  o NULL values. T
10eb0 68 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74  his happens as t
10ec0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
10ed0 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
10ee0 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
10ef0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
10f00 65 20 73 63 68 65 6d 61 2e 20 4e 6f 20 6e 65 65  e schema. No nee
10f10 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  d.          ** t
10f20 6f 20 74 65 73 74 20 74 68 65 20 64 61 74 61 20  o test the data 
10f30 73 74 72 75 63 74 75 72 65 20 61 74 20 72 75 6e  structure at run
10f40 74 69 6d 65 20 69 6e 20 74 68 69 73 20 63 61 73  time in this cas
10f50 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
10f60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10f70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f80 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61  P_Integer, 0, ta
10f90 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
10fa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10fb0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 70 6f  /* This block po
10fc0 70 75 6c 61 74 65 73 20 74 68 65 20 72 4e 6f 74  pulates the rNot
10fd0 46 6f 75 6e 64 20 72 65 67 69 73 74 65 72 20 77  Found register w
10fe0 69 74 68 20 65 69 74 68 65 72 20 4e 55 4c 4c 0a  ith either NULL.
10ff0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
11000 30 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76 61  0 (an integer va
11010 6c 75 65 29 2e 20 49 66 20 74 68 65 20 64 61 74  lue). If the dat
11020 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  a structure cont
11030 61 69 6e 73 20 6f 6e 65 0a 20 20 20 20 20 20 20  ains one.       
11040 20 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 4e 55     ** or more NU
11050 4c 4c 73 2c 20 74 68 65 6e 20 73 65 74 20 72 4e  LLs, then set rN
11060 6f 74 46 6f 75 6e 64 20 74 6f 20 4e 55 4c 4c 2e  otFound to NULL.
11070 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
11080 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
11090 74 6f 20 30 2e 20 49 66 20 72 65 67 69 73 74 65  to 0. If registe
110a0 72 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69  r rMayHaveNull i
110b0 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
110c0 20 73 6f 6d 65 20 76 61 6c 75 65 0a 20 20 20 20   some value.    
110d0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74        ** other t
110e0 68 61 6e 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  han NULL, then t
110f0 68 65 20 74 65 73 74 20 68 61 73 20 61 6c 72 65  he test has alre
11100 61 64 79 20 62 65 65 6e 20 72 75 6e 20 61 6e 64  ady been run and
11110 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72   .          ** r
11120 4e 6f 74 46 6f 75 6e 64 20 69 73 20 61 6c 72 65  NotFound is alre
11130 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e 0a 20  ady populated.. 
11140 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
11150 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
11160 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 65 63 6f  st char nullReco
11170 72 64 5b 5d 20 3d 20 7b 20 30 78 30 32 2c 20 30  rd[] = { 0x02, 0
11180 78 30 30 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  x00 };.         
11190 20 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j3 = sqlite3Vdb
111a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
111b0 74 4e 75 6c 6c 2c 20 72 4d 61 79 48 61 76 65 4e  tNull, rMayHaveN
111c0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
111d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
111e0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
111f0 20 72 4e 6f 74 46 6f 75 6e 64 29 3b 0a 20 20 20   rNotFound);.   
11200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11210 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
11220 6c 6f 62 2c 20 32 2c 20 72 4d 61 79 48 61 76 65  lob, 2, rMayHave
11230 4e 75 6c 6c 2c 20 30 2c 20 0a 20 20 20 20 20 20  Null, 0, .      
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 20 6e 75 6c 6c 52 65 63 6f 72         nullRecor
11260 64 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  d, P4_STATIC);. 
11270 20 20 20 20 20 20 20 20 20 6a 34 20 3d 20 73 71           j4 = sq
11280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11290 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
112a0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
112b0 4d 61 79 48 61 76 65 4e 75 6c 6c 29 3b 0a 20 20  MayHaveNull);.  
112c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
112d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
112e0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 4e 6f 74  Integer, 0, rNot
112f0 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  Found);.        
11300 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11310 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20 20  pHere(v, j4);.  
11320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11330 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11340 33 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  3);..          /
11350 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
11360 20 6f 66 20 72 65 67 69 73 74 65 72 20 72 4e 6f   of register rNo
11370 74 46 6f 75 6e 64 20 28 77 68 69 63 68 20 69 73  tFound (which is
11380 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
11390 30 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  0).          ** 
113a0 69 6e 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  into the target 
113b0 72 65 67 69 73 74 65 72 2e 20 54 68 69 73 20 77  register. This w
113c0 69 6c 6c 20 62 65 20 74 68 65 20 72 65 73 75 6c  ill be the resul
113d0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
113e0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
113f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11420 5f 43 6f 70 79 2c 20 72 4e 6f 74 46 6f 75 6e 64  _Copy, rNotFound
11430 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11460 6d 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20  mpHere(v, j2);. 
11470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11480 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b  JumpHere(v, j5);
11490 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
114a0 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65  nt((v, "end IN e
114b0 78 70 72 20 72 25 64 22 2c 20 74 61 72 67 65 74  xpr r%d", target
114c0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
114d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
114e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
114f0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
11500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11510 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
11520 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
11530 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
11540 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
11550 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
11560 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
11570 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
11580 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
11590 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
115a0 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
115b0 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
115c0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
115d0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
115e0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
115f0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
11600 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
11610 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
11620 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
11630 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  m = pExpr->pList
11640 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
11650 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
11660 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
11670 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61  codeCompareOpera
11680 6e 64 73 28 70 50 61 72 73 65 2c 20 70 4c 65 66  nds(pParse, pLef
11690 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65 65  t, &r1, &regFree
116a0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 20 70 52 69 67 68 74 2c 20 26 72 32       pRight, &r2
116d0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
116e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
116f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
11700 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
11710 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
11720 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65    r3 = sqlite3Ge
11730 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11740 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c  ;.      r4 = sql
11750 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11760 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f  Parse);.      co
11770 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
11780 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
11790 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20   OP_Ge,.        
117a0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
117b0 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r3, SQLITE_STO
117c0 52 45 50 32 29 3b 0a 20 20 20 20 20 20 70 4c 49  REP2);.      pLI
117d0 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
117e0 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
117f0 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
11800 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11810 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
11820 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
11830 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
11840 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
11850 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
11860 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11870 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
11880 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
11890 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
118a0 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
118b0 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
118c0 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
118d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118e0 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33  p3(v, OP_And, r3
118f0 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r4, target);. 
11900 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
11910 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
11920 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 73 71  e, r3);.      sq
11930 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11940 52 65 67 28 70 50 61 72 73 65 2c 20 72 34 29 3b  Reg(pParse, r4);
11950 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11960 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11970 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
11980 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
11990 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
119a0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
119b0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
119c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
119d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
119e0 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
119f0 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
11a00 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
11a10 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
11a20 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
11a30 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
11a40 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
11a50 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
11a60 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
11a70 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
11a80 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
11a90 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
11aa0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
11ab0 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
11ac0 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
11ad0 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
11ae0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
11af0 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
11b00 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
11b10 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
11b20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
11b30 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
11b40 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
11b50 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
11b60 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
11b70 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
11b80 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78    ** Y is in pEx
11b90 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65  pr->pRight.  The
11ba0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
11bb0 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69  nal.  If there i
11bc0 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45  s no.    ** ELSE
11bd0 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f   clause and no o
11be0 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65  ther term matche
11bf0 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
11c00 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  lt of the.    **
11c10 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55   exprssion is NU
11c20 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
11c30 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
11c40 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
11c50 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
11c60 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
11c70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
11c80 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
11c90 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
11ca0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
11cb0 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
11cc0 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
11cd0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
11ce0 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
11cf0 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
11d00 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
11d10 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
11d20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
11d30 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ASE: {.      int
11d40 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d60 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
11d70 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
11d80 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
11d90 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11db0 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
11dc0 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
11dd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
11de0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
11df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
11e00 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
11e10 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
11e20 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11e50 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
11e60 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
11e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11e80 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
11e90 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
11ea0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11eb0 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
11ec0 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
11ed0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
11ee0 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f00 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
11f10 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
11f20 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20  Expr cacheX;    
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72    /* Cached expr
11f50 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20  ession X */.    
11f60 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
11f90 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
11fa0 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20 20 20   Expr *pTest;   
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
11fd0 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
11fe0 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20  (form B) */..   
11ff0 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
12000 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
12010 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
12020 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
12030 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
12040 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
12050 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
12060 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
12070 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
12080 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
12090 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
120a0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
120b0 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
120c0 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
120d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
120e0 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
120f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
12100 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  ){.        cache
12110 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
12120 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
12130 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
12140 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pX->op==TK_REGIS
12150 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 63  TER );.        c
12160 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d 20 73  acheX.iTable = s
12170 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
12180 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
12190 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
121a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
121b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
121c0 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d 20      cacheX.op = 
121d0 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
121e0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
121f0 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
12200 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
12210 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20  ft = &cacheX;.  
12220 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
12230 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
12240 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
12250 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b  disableColCache+
12260 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  +;.      for(i=0
12270 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32  ; i<nExpr; i=i+2
12280 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12290 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  X ){.          o
122a0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
122b0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
122c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
122d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
122e0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
122f0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
12300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
12310 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
12320 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12330 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12340 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
12350 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74  _COLUMN || pTest
12360 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
12370 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  R );.        sql
12380 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
12390 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
123a0 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
123b0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
123c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
123d0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
123e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
123f0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  MN );.        te
12400 73 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65  stcase( aListele
12410 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  m[i+1].pExpr->op
12420 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
12430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12440 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12450 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
12460 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
12470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12480 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12490 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65  Goto, 0, endLabe
124a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
124b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
124c0 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
124d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
124e0 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
124f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
12500 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12510 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
12520 68 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ht, target);.   
12530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12550 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
12560 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
12570 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12580 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12590 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
125a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
125b0 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
125c0 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
125d0 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
125e0 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20  ColCache--;.    
125f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
12600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12610 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
12620 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
12630 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73        if( !pPars
12640 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
12650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12660 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20         "RAISE() 
12690 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
126a0 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
126b0 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20  r-program");.   
126c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
126d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
126e0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
126f0 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
12700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12710 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f  Expr->iColumn==O
12720 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20  E_Rollback ||.  
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12740 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
12750 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20   OE_Abort ||.   
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12770 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
12780 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20  OE_Fail );.     
12790 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
127a0 74 65 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  teExpr(db, pExpr
127b0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
127c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
127d0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
127e0 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
127f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a  pr->iColumn, 0,.
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
12820 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
12830 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
12840 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
12850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12860 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
12870 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
12880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
128a0 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
128b0 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
128c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
128d0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
128e0 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
128f0 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
12900 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12910 74 28 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e  t((v, "raise(IGN
12920 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
12930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12940 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
12950 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12960 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12970 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
12980 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12990 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
129a0 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
129b0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
129c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
129d0 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65  valuate an expre
129e0 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ssion and store 
129f0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
12a00 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
12a10 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
12a20 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72  ster number wher
12a30 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
12a40 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
12a50 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74  ** If the regist
12a60 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  er is a temporar
12a70 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  y register that 
12a80 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74  can be deallocat
12a90 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  ed,.** then writ
12aa0 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74  e its number int
12ab0 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65  o *pReg.  If the
12ac0 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
12ad0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d   is not.** a tem
12ae0 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74  porary, then set
12af0 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a   *pReg to zero..
12b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
12b10 70 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65  prCodeTemp(Parse
12b20 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
12b30 70 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67  pExpr, int *pReg
12b40 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
12b50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12b60 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
12b70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
12b80 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
12b90 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
12ba0 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20  if( r2==r1 ){.  
12bb0 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
12bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
12bd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12be0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
12bf0 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d    *pReg = 0;.  }
12c00 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
12c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12c20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
12c30 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
12c40 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
12c50 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
12c60 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
12c70 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
12c80 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
12c90 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
12ca0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
12cb0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12cc0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
12cd0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
12ce0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
12cf0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
12d00 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
12d10 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
12d20 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
12d30 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
12d40 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
12d50 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
12d60 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28  rget);.  assert(
12d70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
12d80 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
12d90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
12da0 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
12db0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64  t && pParse->pVd
12dc0 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  be ){.    sqlite
12dd0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
12de0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
12df0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
12e00 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  et);.  }.  retur
12e10 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n target;.}../*.
12e20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12e30 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
12e40 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
12e50 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
12e60 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
12e70 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
12e80 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
12e90 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
12ea0 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
12eb0 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
12ec0 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
12ed0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
12ee0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
12ef0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
12f00 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
12f10 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
12f20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
12f30 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
12f40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12f50 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
12f60 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
12f70 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
12f80 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
12f90 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
12fa0 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
12fb0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
12fc0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
12fd0 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reused..*/.int s
12fe0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
12ff0 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  dCache(Parse *pP
13000 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
13010 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
13020 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
13030 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
13040 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20   inReg;.  inReg 
13050 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
13060 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
13070 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
13080 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
13090 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
130a0 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20  =TK_REGISTER ){ 
130b0 20 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a   .    int iMem;.
130c0 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61      iMem = ++pPa
130d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
130e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130f0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52  (v, OP_Copy, inR
13100 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70  eg, iMem);.    p
13110 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
13120 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  Mem;.    pExpr->
13130 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
13140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
13150 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nReg;.}../*.** R
13160 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 45  eturn TRUE if pE
13170 78 70 72 20 69 73 20 61 6e 20 63 6f 6e 73 74 61  xpr is an consta
13180 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  nt expression th
13190 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
131a0 65 0a 2a 2a 20 66 6f 72 20 66 61 63 74 6f 72 69  e.** for factori
131b0 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ng out of a loop
131c0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
131d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 3a 0a  xpressions are:.
131e0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e 79 20  **.**    *  Any 
131f0 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
13200 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 77 6f  evaluates to two
13210 20 6f 72 20 6d 6f 72 65 20 6f 70 63 6f 64 65 73   or more opcodes
13220 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 41 6e  ..**.**    *  An
13230 79 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 4f 50  y OP_Integer, OP
13240 5f 52 65 61 6c 2c 20 4f 50 5f 53 74 72 69 6e 67  _Real, OP_String
13250 2c 20 4f 50 5f 42 6c 6f 62 2c 20 4f 50 5f 4e 75  , OP_Blob, OP_Nu
13260 6c 6c 2c 20 0a 2a 2a 20 20 20 20 20 20 20 6f 72  ll, .**       or
13270 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 74 68 61   OP_Variable tha
13280 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
13290 74 6f 20 62 65 20 70 6c 61 63 65 64 20 69 6e 20  to be placed in 
132a0 61 20 0a 2a 2a 20 20 20 20 20 20 20 73 70 65 63  a .**       spec
132b0 69 66 69 63 20 72 65 67 69 73 74 65 72 2e 0a 2a  ific register..*
132c0 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f  *.** There is no
132d0 20 70 6f 69 6e 74 20 69 6e 20 66 61 63 74 6f 72   point in factor
132e0 69 6e 67 20 6f 75 74 20 73 69 6e 67 6c 65 2d 69  ing out single-i
132f0 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73 74  nstruction const
13300 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
13310 6e 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ns that need to 
13320 62 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 70  be placed in a p
13330 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
13340 65 72 2e 20 20 0a 2a 2a 20 57 65 20 63 6f 75 6c  er.  .** We coul
13350 64 20 66 61 63 74 6f 72 20 74 68 65 6d 20 6f 75  d factor them ou
13360 74 2c 20 62 75 74 20 74 68 65 6e 20 77 65 20 77  t, but then we w
13370 6f 75 6c 64 20 65 6e 64 20 75 70 20 61 64 64 69  ould end up addi
13380 6e 67 20 61 6e 0a 2a 2a 20 4f 50 5f 53 43 6f 70  ng an.** OP_SCop
13390 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  y instruction to
133a0 20 6d 6f 76 65 20 74 68 65 20 76 61 6c 75 65 20   move the value 
133b0 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
133c0 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6c 61 74   register.** lat
133d0 65 72 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  er.  We might as
133e0 20 77 65 6c 6c 20 6a 75 73 74 20 75 73 65 20 74   well just use t
133f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 73 74  he original inst
13400 72 75 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 61  ruction and.** a
13410 76 6f 69 64 20 74 68 65 20 4f 50 5f 53 43 6f 70  void the OP_SCop
13420 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
13430 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
13440 72 46 61 63 74 6f 72 69 6e 67 28 45 78 70 72 20  rFactoring(Expr 
13450 2a 70 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69  *p){.  if( !sqli
13460 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
13470 74 4e 6f 74 4a 6f 69 6e 28 70 29 20 29 7b 0a 20  tNotJoin(p) ){. 
13480 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
13490 20 4f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 65   Only constant e
134a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 61  xpressions are a
134b0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 66  ppropriate for f
134c0 61 63 74 6f 72 69 6e 67 20 2a 2f 0a 20 20 7d 0a  actoring */.  }.
134d0 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
134e0 26 20 45 50 5f 46 69 78 65 64 44 65 73 74 29 3d  & EP_FixedDest)=
134f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
13500 20 31 3b 20 20 2f 2a 20 41 6e 79 20 63 6f 6e 73   1;  /* Any cons
13510 74 61 6e 74 20 77 69 74 68 6f 75 74 20 61 20 66  tant without a f
13520 69 78 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e  ixed destination
13530 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
13540 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
13550 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
13560 29 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a  ) p = p->pLeft;.
13570 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
13580 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
13590 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
135a0 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
135b0 42 4c 4f 42 3a 0a 23 65 6e 64 69 66 0a 20 20 20  BLOB:.#endif.   
135c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
135d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  E:.    case TK_I
135e0 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
135f0 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
13600 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
13610 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
13620 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
13630 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 42 4c 4f  e( p->op==TK_BLO
13640 42 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  B );.      testc
13650 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 56  ase( p->op==TK_V
13660 41 52 49 41 42 4c 45 20 29 3b 0a 20 20 20 20 20  ARIABLE );.     
13670 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13680 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 3b 0a  ==TK_INTEGER );.
13690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
136a0 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  p->op==TK_FLOAT 
136b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
136c0 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  e( p->op==TK_NUL
136d0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
136e0 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53  ase( p->op==TK_S
136f0 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 2f  TRING );.      /
13700 2a 20 53 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63  * Single-instruc
13710 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20 77  tion constants w
13720 69 74 68 20 61 20 66 69 78 65 64 20 64 65 73 74  ith a fixed dest
13730 69 6e 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20  ination are.    
13740 20 20 2a 2a 20 62 65 74 74 65 72 20 64 6f 6e 65    ** better done
13750 20 69 6e 2d 6c 69 6e 65 2e 20 20 49 66 20 77 65   in-line.  If we
13760 20 66 61 63 74 6f 72 20 74 68 65 6d 2c 20 74 68   factor them, th
13770 65 79 20 77 69 6c 6c 20 6a 75 73 74 20 65 6e 64  ey will just end
13780 0a 20 20 20 20 20 20 2a 2a 20 75 70 20 67 65 6e  .      ** up gen
13790 65 72 61 74 69 6e 67 20 61 6e 20 4f 50 5f 53 43  erating an OP_SC
137a0 6f 70 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  opy to move the 
137b0 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 65 73  value to the des
137c0 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  tination.      *
137d0 2a 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20  * register. */. 
137e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
137f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
13800 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
13810 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 2d 3e    if( p->pLeft->
13820 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
13830 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  p->pLeft->op==TK
13840 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
13850 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 62        }.       b
13870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13880 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
13890 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
138a0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
138b0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  ./*.** If pExpr 
138c0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  is a constant ex
138d0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
138e0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
138f0 0a 2a 2a 20 66 61 63 74 6f 72 69 6e 67 20 6f 75  .** factoring ou
13900 74 20 6f 66 20 61 20 6c 6f 6f 70 2c 20 74 68 65  t of a loop, the
13910 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 65  n evaluate the e
13920 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 74  xpression.** int
13930 6f 20 61 20 72 65 67 69 73 74 65 72 20 61 6e 64  o a register and
13940 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
13950 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 20 54  ression into a T
13960 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a 20 65 78  K_REGISTER.** ex
13970 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  pression..*/.sta
13980 74 69 63 20 69 6e 74 20 65 76 61 6c 43 6f 6e 73  tic int evalCons
13990 74 45 78 70 72 28 57 61 6c 6b 65 72 20 2a 70 57  tExpr(Walker *pW
139a0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
139b0 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
139c0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
139d0 70 50 61 72 73 65 3b 0a 20 20 73 77 69 74 63 68  pParse;.  switch
139e0 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
139f0 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
13a00 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  TER: {.      ret
13a10 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
13a20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
13a30 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
13a40 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
13a50 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
13a60 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UNC: {.      /* 
13a70 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
13a80 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65   a function have
13a90 20 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61   a fixed destina
13aa0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d  tion..      ** M
13ab0 61 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61  ark them this wa
13ac0 79 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72  y to avoid gener
13ad0 61 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50  ated unneeded OP
13ae0 5f 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  _SCopy.      ** 
13af0 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20  instructions. . 
13b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
13b10 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
13b20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
13b30 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
13b40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d  .        int i =
13b50 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
13b60 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
13b70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
13b80 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20  em = pList->a;. 
13b90 20 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30         for(; i>0
13ba0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
13bb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13bc0 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 20 70 49  Item->pExpr ) pI
13bd0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67  tem->pExpr->flag
13be0 73 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73  s |= EP_FixedDes
13bf0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
13c00 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13c20 28 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46  ( isAppropriateF
13c30 6f 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70  orFactoring(pExp
13c40 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  r) ){.    int r1
13c50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13c60 6d 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20  m;.    int r2;. 
13c70 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
13c80 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
13c90 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
13ca0 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 32  ;.    if( r1!=r2
13cb0 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
13cc0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13cd0 20 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d   r1);.    pExpr-
13ce0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
13cf0 52 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  R;.    pExpr->iT
13d00 61 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72  able = r2;.    r
13d10 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
13d20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
13d30 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
13d40 2a 0a 2a 2a 20 50 72 65 65 76 61 6c 75 61 74 65  *.** Preevaluate
13d50 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70   constant subexp
13d60 72 65 73 73 69 6f 6e 73 20 77 69 74 68 69 6e 20  ressions within 
13d70 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
13d80 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
13d90 6e 20 72 65 67 69 73 74 65 72 73 2e 20 20 4d 6f  n registers.  Mo
13da0 64 69 66 79 20 70 45 78 70 72 20 73 6f 20 74 68  dify pExpr so th
13db0 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
13dc0 73 75 62 65 78 70 72 65 73 69 6f 6e 73 0a 2a 2a  subexpresions.**
13dd0 20 61 72 65 20 54 4b 5f 52 45 47 49 53 54 45 52   are TK_REGISTER
13de0 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 72 65   opcodes that re
13df0 66 65 72 20 74 6f 20 74 68 65 20 70 72 65 63 6f  fer to the preco
13e00 6d 70 75 74 65 64 20 76 61 6c 75 65 73 2e 0a 2a  mputed values..*
13e10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13e20 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
13e30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
13e40 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
13e50 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
13e60 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 76 61  prCallback = eva
13e70 6c 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 77 2e  lConstExpr;.  w.
13e80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
13e90 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  = 0;.  w.pParse 
13ea0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
13eb0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
13ec0 70 45 78 70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pExpr);.}.../*.*
13ed0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13ee0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
13ef0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
13f00 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
13f10 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
13f20 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
13f30 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
13f40 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
13f50 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
13f60 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
13f70 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
13f80 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  luated..*/.int s
13f90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
13fa0 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
13fb0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
13fc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13fd0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13fe0 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
13ff0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
14000 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
14010 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
14020 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
14030 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
14040 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79    int doHardCopy
14050 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 61 20 68       /* Make a h
14060 61 72 64 20 63 6f 70 79 20 6f 66 20 65 76 65 72  ard copy of ever
14070 79 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  y element */.){.
14080 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
14090 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
140a0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73   int i, n;.  ass
140b0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
140c0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
140d0 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69  t>0 );.  n = pLi
140e0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
140f0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
14100 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
14110 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
14120 28 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20  ( pItem->iAlias 
14130 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65  ){.      int iRe
14140 67 20 3d 20 63 6f 64 65 41 6c 69 61 73 28 70 50  g = codeAlias(pP
14150 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 69 41 6c  arse, pItem->iAl
14160 69 61 73 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  ias, pItem->pExp
14170 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
14180 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
14190 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
141a0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
141b0 69 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  iReg!=target+i )
141c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
141d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
141e0 50 5f 53 43 6f 70 79 2c 20 69 52 65 67 2c 20 74  P_SCopy, iReg, t
141f0 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20  arget+i);.      
14200 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
14210 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14220 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  de(pParse, pItem
14230 2d 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b  ->pExpr, target+
14240 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
14250 28 20 64 6f 48 61 72 64 43 6f 70 79 20 29 7b 0a  ( doHardCopy ){.
14260 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14270 72 48 61 72 64 43 6f 70 79 28 70 50 61 72 73 65  rHardCopy(pParse
14280 2c 20 74 61 72 67 65 74 2c 20 6e 29 3b 0a 20 20  , target, n);.  
14290 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
142a0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
142b0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
142c0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
142d0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
142e0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
142f0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
14300 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
14310 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
14320 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
14330 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
14340 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
14350 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
14360 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
14370 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
14380 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
14390 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
143a0 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
143b0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
143c0 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
143d0 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
143e0 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
143f0 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
14400 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
14410 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
14420 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
14430 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
14440 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
14450 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
14460 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
14470 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14480 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
14490 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
144a0 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
144b0 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
144c0 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
144d0 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
144e0 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
144f0 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
14500 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
14510 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
14520 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
14530 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
14540 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
14550 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
14560 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
14570 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
14580 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
14590 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
145a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
145b0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
145c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
145d0 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
145e0 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
145f0 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
14600 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
14610 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
14620 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
14630 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 76  ll==0 );.  if( v
14640 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
14650 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d  ) return;.  op =
14660 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
14670 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
14680 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
14690 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
146a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
146b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
146c0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
146d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  l==0 );.      te
146e0 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e  stcase( pParse->
146f0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d  disableColCache=
14700 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
14710 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14720 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
14730 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
14740 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
14750 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61  NULL);.      pPa
14760 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14770 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ache++;.      sq
14780 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
14790 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
147a0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
147b0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
147c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
147d0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
147e0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
147f0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
14800 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
14810 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14820 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
14830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14840 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
14850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14860 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
14870 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14880 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14890 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a  eColCache==0 );.
148a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
148b0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
148c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
148d0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
148e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
148f0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
14900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14910 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
14920 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
14930 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
14940 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
14950 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14960 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
14970 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
14980 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
14990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
149b0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
149c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
149d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
149e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
149f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14a00 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
14a10 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
14a20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14a30 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
14a40 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
14a50 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
14a60 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
14a70 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
14a80 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
14a90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14aa0 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
14ab0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
14ac0 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
14ad0 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
14ae0 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
14af0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
14b00 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
14b10 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
14b20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14b30 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
14b40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14b50 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ( op==TK_LT );. 
14b60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
14b70 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
14b80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
14b90 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  TK_GT );.      t
14ba0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
14bb0 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
14bc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20  case( op==TK_EQ 
14bd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14be0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  e( op==TK_NE );.
14bf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14c00 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
14c10 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
14c20 72 65 4f 70 65 72 61 6e 64 73 28 70 50 61 72 73  reOperands(pPars
14c30 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14c40 20 26 72 31 2c 20 26 72 65 67 46 72 65 65 31 2c   &r1, &regFree1,
14c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
14c80 2c 20 26 72 32 2c 20 26 72 65 67 46 72 65 65 32  , &r2, &regFree2
14c90 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
14ca0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
14cb0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
14cc0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75  r1, r2, dest, ju
14cf0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
14d00 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
14d10 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
14d20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
14d30 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
14d40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14d50 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
14d60 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
14d70 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
14d80 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
14d90 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
14da0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
14db0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
14dc0 6c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  l );.      testc
14dd0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
14de0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LL );.      test
14df0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
14e00 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31  NULL );.      r1
14e10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
14e20 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
14e30 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
14e40 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
14e50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14e60 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74  (v, op, r1, dest
14e70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14e80 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
14e90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14ea0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
14eb0 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
14ec0 20 20 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45    /*    x BETWEE
14ed0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20  N y AND z.      
14ee0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65  **.      ** Is e
14ef0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
14f00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14f10 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
14f20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14f30 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
14f40 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
14f50 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
14f60 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20   subexpression. 
14f70 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61       ** elementa
14f80 74 69 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20  tion of x..     
14f90 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65   */.      Expr e
14fa0 78 70 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78  xprAnd;.      Ex
14fb0 70 72 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  pr compLeft;.   
14fc0 20 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68     Expr compRigh
14fd0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 65 78  t;.      Expr ex
14fe0 70 72 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72  prX;..      expr
14ff0 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
15000 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
15010 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
15020 20 20 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66      exprAnd.pLef
15030 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20  t = &compLeft;. 
15040 20 20 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69       exprAnd.pRi
15050 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
15060 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
15070 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20  .op = TK_GE;.   
15080 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66     compLeft.pLef
15090 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20  t = &exprX;.    
150a0 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68    compLeft.pRigh
150b0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
150c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
150d0 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70      compRight.op
150e0 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20   = TK_LE;.      
150f0 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
15100 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
15110 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74  compRight.pRight
15120 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
15130 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
15140 20 20 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20     exprX.iTable 
15150 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15160 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65  eTemp(pParse, &e
15170 78 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29  xprX, &regFree1)
15180 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15190 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
151a0 0a 20 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20  .      exprX.op 
151b0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
151c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
151d0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
151e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
151f0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
15200 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
15210 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
15220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15230 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
15240 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15250 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15260 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65  arse, pExpr, &re
15270 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
15280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15290 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
152a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
152b0 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  =0);.      testc
152c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
152d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
152e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
152f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
15300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
15310 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15320 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
15330 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
15340 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15350 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
15360 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
15370 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
15380 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
15390 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
153a0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
153b0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
153c0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
153d0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
153e0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
153f0 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
15400 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
15410 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
15420 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
15430 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
15440 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
15450 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
15460 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
15470 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
15480 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
15490 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
154a0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
154b0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
154c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
154d0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
154e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
154f0 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
15500 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
15510 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15520 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15530 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
15540 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
15550 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
15560 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
15570 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
15580 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
15590 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
155a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
155b0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
155c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
155d0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
155e0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
155f0 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
15600 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
15610 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
15620 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
15630 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
15640 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
15650 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
15660 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
15670 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
15680 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
15690 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
156a0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
156b0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
156c0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
156d0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
156e0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
156f0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
15700 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
15710 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
15720 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
15730 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
15740 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
15750 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
15760 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
15770 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
15780 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
15790 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
157a0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
157b0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
157c0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
157d0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
157e0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
157f0 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
15800 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
15810 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
15820 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
15830 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
15840 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
15850 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
15860 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
15870 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
15880 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
15890 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
158a0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
158b0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
158c0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
158d0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
158e0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
158f0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
15900 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
15910 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
15920 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
15930 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
15940 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
15950 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
15960 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
15970 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
15980 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
15990 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
159a0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
159b0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
159c0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
159d0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
159e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
159f0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
15a00 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
15a10 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
15a20 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
15a30 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
15a40 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
15a50 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
15a60 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
15a70 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
15a80 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
15a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
15aa0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
15ab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15ac0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
15ad0 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
15ae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15af0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
15b00 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
15b10 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
15b20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
15b30 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
15b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15b50 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
15b60 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
15b70 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
15b80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15b90 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15ba0 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20  ColCache>0 );.  
15bb0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
15bc0 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20  bleColCache--;. 
15bd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15be0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
15bf0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
15c00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
15c10 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
15c20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
15c30 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
15c40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
15c50 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
15c60 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ache==0 );.     
15c70 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
15c80 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
15c90 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d  ->pLeft, d2, jum
15ca0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
15cb0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
15cc0 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
15cd0 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
15ce0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
15cf0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
15d00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
15d10 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
15d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15d30 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
15d40 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
15d50 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
15d60 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20  ColCache--;.    
15d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15d80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
15d90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15da0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
15db0 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
15dc0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
15dd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15de0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
15df0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
15e00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15e10 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
15e20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
15e30 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
15e40 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
15e50 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
15e60 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
15e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
15e80 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==TK_LT );.     
15e90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
15ea0 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65  K_LE );.      te
15eb0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47  stcase( op==TK_G
15ec0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15ed0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45 20 29  ase( op==TK_GE )
15ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15ef0 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20  ( op==TK_EQ );. 
15f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15f10 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20  p==TK_NE );.    
15f20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
15f30 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
15f40 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
15f50 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
15f60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 31  Expr->pLeft, &r1
15f70 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15fa0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
15fb0 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  2, &regFree2);. 
15fc0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15fd0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15fe0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
15ff0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
16000 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
16010 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r2, dest, jumpIf
16020 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  Null);.      tes
16030 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
16040 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
16050 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
16060 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
16070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16080 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
16090 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
160a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
160b0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
160c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
160d0 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
160e0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  LL );.      r1 =
160f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16100 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16110 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16120 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
16130 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16140 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
16150 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16160 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16180 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
16190 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
161a0 2f 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  /*    x BETWEEN 
161b0 79 20 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a  y AND z.      **
161c0 0a 20 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75  .      ** Is equ
161d0 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
161e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
161f0 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
16200 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16210 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68   Code it as such
16220 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  , taking care to
16230 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73   do the common s
16240 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  ubexpression.   
16250 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69     ** elementati
16260 6f 6e 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a  on of x..      *
16270 2f 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70  /.      Expr exp
16280 72 41 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72  rAnd;.      Expr
16290 20 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20   compLeft;.     
162a0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
162b0 0a 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72  .      Expr expr
162c0 58 3b 0a 0a 20 20 20 20 20 20 65 78 70 72 58 20  X;..      exprX 
162d0 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
162e0 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f  .      exprAnd.o
162f0 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20  p = TK_AND;.    
16300 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
16310 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20  = &compLeft;.   
16320 20 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68     exprAnd.pRigh
16330 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
16340 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f        compLeft.o
16350 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20  p = TK_GE;.     
16360 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20   compLeft.pLeft 
16370 3d 20 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20  = &exprX;.      
16380 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
16390 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
163a0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
163b0 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d    compRight.op =
163c0 20 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f   TK_LE;.      co
163d0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
163e0 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
163f0 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
16400 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
16410 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
16420 20 65 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20   exprX.iTable = 
16430 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16440 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
16450 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  rX, &regFree1);.
16460 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16470 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
16480 20 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20       exprX.op = 
16490 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
164a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
164b0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
164c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
164d0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
164e0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
164f0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
16500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16510 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
16520 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16530 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16540 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
16550 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
16560 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16570 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
16580 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
16590 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 74 65 73  l!=0);.      tes
165a0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
165b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
165c0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
165d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
165e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
165f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16600 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16610 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
16620 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16630 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
16640 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
16650 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
16660 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
16670 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
16680 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
16690 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
166a0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
166b0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
166c0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
166d0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
166e0 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
166f0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
16700 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
16710 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
16720 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
16730 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
16740 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
16750 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
16760 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
16770 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
16780 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
16790 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
167a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
167b0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
167c0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
167d0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
167e0 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
167f0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
16800 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
16810 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
16820 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
16830 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
16840 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
16850 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
16860 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
16870 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
16880 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
16890 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
168a0 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
168b0 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
168c0 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
168d0 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
168e0 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
168f0 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
16900 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
16910 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
16920 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
16930 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
16940 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
16950 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
16960 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
16970 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
16980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
16990 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  =pA;.  }.  if( p
169a0 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
169b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
169c0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
169d0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
169e0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
169f0 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nct) ) return 0;
16a00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
16a10 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
16a20 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
16a30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
16a40 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
16a50 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
16a60 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
16a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
16a80 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
16a90 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
16aa0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
16ab0 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
16ac0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
16ad0 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
16ae0 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
16af0 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
16b00 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
16b10 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
16b20 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
16b30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16b40 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  , pB->pList->a[i
16b50 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
16b60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16b70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
16b80 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73  lse if( pB->pLis
16b90 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
16ba0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
16bb0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e  >pSelect || pB->
16bc0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
16bd0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   0;.  if( pA->iT
16be0 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
16bf0 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
16c00 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
16c10 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
16c20 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
16c30 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pA->token.z 
16c40 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  ){.    if( pB->t
16c50 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75  oken.z==0 ) retu
16c60 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42  rn 0;.    if( pB
16c70 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74  ->token.n!=pA->t
16c80 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20  oken.n ) return 
16c90 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
16ca0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
16cb0 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63  *)pA->token.z,(c
16cc0 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pB->token.z
16cd0 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30  ,pB->token.n)!=0
16ce0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16cf0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
16d00 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a  return 1;.}.../*
16d10 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
16d20 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
16d30 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
16d40 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
16d50 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
16d60 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
16d70 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
16d80 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
16d90 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
16da0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
16db0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
16dc0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
16dd0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
16de0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
16df0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16e00 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
16e10 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
16e20 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
16e30 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
16e40 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
16e50 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
16e60 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  umn,.       &pIn
16e70 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63  fo->nColumnAlloc
16e80 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
16e90 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
16ea0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
16eb0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
16ec0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
16ed0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
16ee0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
16ef0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
16f00 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
16f10 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
16f20 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
16f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
16f40 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
16f50 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
16f60 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
16f70 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
16f80 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
16f90 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
16fa0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
16fb0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
16fc0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
16fd0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
16fe0 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
16ff0 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
17000 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
17010 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
17020 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
17030 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
17040 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72  his is the xExpr
17050 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74  Callback for a t
17060 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20  ree walker.  It 
17070 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d  is used to.** im
17080 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45  plement sqlite3E
17090 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
170a0 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
170b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
170c0 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
170d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
170e0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
170f0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
17100 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a  gregate(Walker *
17110 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
17120 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
17130 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
17140 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
17150 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
17160 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
17170 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
17180 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
17190 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
171a0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
171b0 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20  NC->pAggInfo;.. 
171c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
171d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
171e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
171f0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
17200 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
17210 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
17220 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
17230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17240 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
17250 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  LUMN );.      /*
17260 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
17270 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
17280 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
17290 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
172a0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
172b0 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
172c0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
172d0 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
172e0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
172f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
17300 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
17310 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
17320 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
17330 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
17340 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
17350 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
17360 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
17370 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
17380 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
17390 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
173a0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
173b0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
173c0 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
173d0 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
173e0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
173f0 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
17400 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
17410 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
17420 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
17430 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
17440 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
17450 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
17460 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
17470 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
17480 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
17490 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
174a0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
174b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
174c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
174d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
174e0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
174f0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
17500 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
17510 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
17520 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
17530 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
17540 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
17550 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
17570 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
17580 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
175a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
175b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
175c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
175d0 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
175e0 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
175f0 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
17600 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
17610 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
17620 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
17630 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17640 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
17650 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
17660 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
17670 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
17680 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
17690 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
176a0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
176b0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
176c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
176d0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
176e0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
176f0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
17700 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
17710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
17720 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
17730 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
17740 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
17750 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
17760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
17770 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
17780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17790 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
177b0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
177c0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
177d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
177e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
177f0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
17800 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
17810 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
17820 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
17830 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
17840 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
17850 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
17860 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
17870 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17890 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
178a0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
178b0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
178c0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
178e0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
178f0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
17920 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
17940 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
17950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17970 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17980 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
17990 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
179a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
179b0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
179c0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
179d0 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
179e0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
179f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17a10 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
17a20 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
17a30 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
17a40 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
17a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
17a60 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
17a70 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
17a80 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
17a90 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
17aa0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
17ab0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
17ac0 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
17ad0 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
17ae0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
17af0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
17b00 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
17b10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17b20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
17b30 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
17b40 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
17b50 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
17b60 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
17b70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
17b80 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  g = k;.         
17b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17ba0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
17bb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
17bc0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
17bd0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
17be0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
17bf0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
17c00 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
17c10 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
17c20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
17c30 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
17c40 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
17c50 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
17c60 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
17c70 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
17c80 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
17c90 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
17ca0 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
17cb0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
17cc0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17cd0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
17ce0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
17cf0 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
17d00 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
17d10 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
17d20 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
17d30 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
17d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17d50 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
17d60 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
17d70 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
17d80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17d90 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
17da0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
17db0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
17dc0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
17dd0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
17de0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
17df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17e10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
17e20 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
17e30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
17e40 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
17e50 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
17e60 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
17e70 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
17e80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17e90 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
17ea0 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
17eb0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
17ec0 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
17ed0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
17ee0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
17ef0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
17f00 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
17f10 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
17f20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
17f30 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
17f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
17f50 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
17f60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
17f70 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
17f80 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
17f90 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
17fa0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
17fb0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
17fc0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
17fd0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
17fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ff0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
18000 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
18010 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
18020 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
18030 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
18040 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
18050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
18060 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
18070 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
18080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
18090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
180a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
180b0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
180c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
180d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
180e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
180f0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
18100 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
18110 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
18120 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
18130 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
18140 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
18150 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
18160 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
18170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
18180 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
18190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
181a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
181b0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
181c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
181d0 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
181e0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
181f0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 4e 61   *pSelect){.  Na
18200 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
18210 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
18220 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70  .  if( pNC->nDep
18230 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 43  th==0 ){.    pNC
18240 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
18250 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
18260 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65  t(pWalker, pSele
18270 63 74 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  ct);.    pNC->nD
18280 65 70 74 68 2d 2d 3b 0a 20 20 20 20 72 65 74 75  epth--;.    retu
18290 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
182a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
182b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
182c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61    }.}../*.** Ana
182d0 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
182e0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
182f0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
18300 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
18310 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
18320 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
18330 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
18340 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
18350 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
18360 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
18370 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
18380 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
18390 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
183a0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
183b0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
183c0 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
183d0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
183e0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
183f0 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
18400 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ames()..*/.void 
18410 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
18420 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
18430 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
18440 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57  xpr *pExpr){.  W
18450 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
18460 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
18470 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
18480 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
18490 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
184a0 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
184b0 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
184c0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
184d0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
184e0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
184f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
18500 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
18510 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
18520 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
18530 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
18540 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18550 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
18560 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
18570 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
18580 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
18590 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
185a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
185b0 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
185c0 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
185d0 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
185e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
185f0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
18600 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
18610 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
18620 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
18630 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
18640 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
18650 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18660 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
18670 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
18680 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18690 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
186a0 65 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72  eallocate tempor
186b0 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
186c0 73 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  s during code ge
186d0 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  neration..*/.int
186e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
186f0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
18700 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
18710 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
18720 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
18730 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
18740 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
18750 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
18760 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
18770 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65  void sqlite3Rele
18780 61 73 65 54 65 6d 70 52 65 67 28 50 61 72 73 65  aseTempReg(Parse
18790 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
187a0 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65 67 20  eg){.  if( iReg 
187b0 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  && pParse->nTemp
187c0 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
187d0 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
187e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
187f0 70 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74  prWritableRegist
18800 65 72 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  er(pParse, iReg,
18810 20 69 52 65 67 29 3b 0a 20 20 20 20 70 50 61 72   iReg);.    pPar
18820 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61  se->aTempReg[pPa
18830 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d  rse->nTempReg++]
18840 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
18850 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  /*.** Allocate o
18860 72 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62  r deallocate a b
18870 6c 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e  lock of nReg con
18880 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65  secutive registe
18890 72 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  rs.*/.int sqlite
188a0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61  3GetTempRange(Pa
188b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
188c0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c   nReg){.  int i,
188d0 20 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65   n;.  i = pParse
188e0 2d 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e  ->iRangeReg;.  n
188f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67   = pParse->nRang
18900 65 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67  eReg;.  if( nReg
18910 3c 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f  <=n && !usedAsCo
18920 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
18930 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20  , i, i+n-1) ){. 
18940 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
18950 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
18960 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
18970 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
18980 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
18990 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
189a0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
189b0 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
189c0 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
189d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
189e0 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
189f0 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
18a00 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28  int nReg){.  if(
18a10 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
18a20 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
18a30 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
18a40 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
18a50 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
18a60 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a            iReg;.  }.}.