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

Artifact 7e56d2a24af8137f4bebbfa1d7dd1dcf70107c88:


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 33 35 37 20 32 30 30 38 2f 30 33 2f 32 35 20  .357 2008/03/25 
0220: 30 39 3a 34 37 3a 33 35 20 64 61 6e 69 65 6c 6b  09:47:35 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 6e 74 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  int op = pExpr->
04c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
04d0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
04e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
04f0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0500: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
0510: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0530: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0540: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0550: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0560: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0570: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0580: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
0590: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
05a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
05b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
05c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
05d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
05e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
05f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0600: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0610: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0620: 72 20 74 6f 20 74 68 65 20 72 65 76 69 73 65 64  r to the revised
0630: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
0640: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0650: 71 75 65 6e 63 65 20 69 73 20 6d 61 72 6b 65 64  quence is marked
0660: 20 61 73 20 22 65 78 70 6c 69 63 69 74 22 20 75   as "explicit" u
0670: 73 69 6e 67 20 74 68 65 20 45 50 5f 45 78 70 43  sing the EP_ExpC
0680: 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20  ollate.** flag. 
0690: 20 41 6e 20 65 78 70 6c 69 63 69 74 20 63 6f 6c   An explicit col
06a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
06b0: 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 20 69 6d  will override im
06c0: 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74  plicit.** collat
06d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a  ing sequences..*
06e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
06f0: 78 70 72 53 65 74 43 6f 6c 6c 28 50 61 72 73 65  xprSetColl(Parse
0700: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0710: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
0720: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  ame){.  char *zC
0730: 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oll = 0;        
0740: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
0750: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
0760: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
0770: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
0780: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
0790: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
07a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
07b0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
07c0: 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70  & zColl ){.    p
07d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
07e0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
07f0: 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a  se, zColl, -1);.
0800: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
0810: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43  .      pExpr->pC
0820: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
0830: 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
0840: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
0850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
0860: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
0870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0880: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0890: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
08a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
08b0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
08c0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
08d0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
08e0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
08f0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0900: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0910: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0920: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0930: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0940: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0950: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
0960: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20  .    int op;.   
0970: 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e   pColl = pExpr->
0980: 70 43 6f 6c 6c 3b 0a 20 20 20 20 6f 70 20 3d 20  pColl;.    op = 
0990: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 69  pExpr->op;.    i
09a0: 66 28 20 28 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  f( (op==TK_CAST 
09b0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 29  || op==TK_UPLUS)
09c0: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
09d0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
09e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
09f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
0a00: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ft);.    }.  }. 
0a10: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0a20: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0a30: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0a40: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0a50: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0a60: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0a70: 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   an operand of a
0a80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0a90: 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74  ator.  aff2 is t
0aa0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ab0: 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ity of the other
0ac0: 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
0ad0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0ae0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0af0: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0b00: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0b10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0b20: 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  ator..*/.char sq
0b30: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0b40: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0b50: 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20  , char aff2){.  
0b60: 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69  char aff1 = sqli
0b70: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0b80: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66  pExpr);.  if( af
0b90: 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20  f1 && aff2 ){.  
0ba0: 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20    /* Both sides 
0bb0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0bc0: 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49  n are columns. I
0bd0: 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69  f one has numeri
0be0: 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74  c.    ** affinit
0bf0: 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68  y, use that. Oth
0c00: 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66  erwise use no af
0c10: 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
0c20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
0c30: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
0c40: 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33  aff1) || sqlite3
0c50: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0c60: 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20  y(aff2) ){.     
0c70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0c80: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0ca0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0cb0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0cc0: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0cd0: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0ce0: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0cf0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0d00: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0d10: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0d20: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0d30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
0d40: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0d50: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
0d60: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
0d70: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
0d80: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
0d90: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
0da0: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
0db0: 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c  sert( aff1==0 ||
0dc0: 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20   aff2==0 );.    
0dd0: 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61  return (aff1 + a
0de0: 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ff2);.  }.}../*.
0df0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
0e00: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
0e10: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74  r.  Return the t
0e20: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0e30: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61  t should.** be a
0e40: 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f  pplied to both o
0e50: 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f  perands prior to
0e60: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61   doing the compa
0e70: 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  rison..*/.static
0e80: 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e   char comparison
0e90: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0ea0: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66  Expr){.  char af
0eb0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f;.  assert( pEx
0ec0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
0ed0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
0ee0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  N || pExpr->op==
0ef0: 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LT ||.       
0f00: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
0f10: 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GT || pExpr->op
0f20: 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72  ==TK_GE || pExpr
0f30: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20  ->op==TK_LE ||. 
0f40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
0f50: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61  op==TK_NE );.  a
0f60: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
0f70: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
0f80: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
0f90: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
0fa0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
0fb0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
0fc0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
0fd0: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
0fe0: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
0ff0: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45   }.  else if( pE
1000: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
1010: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1020: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1030: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d  (pExpr->pSelect-
1040: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1050: 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20  xpr, aff);.  }. 
1060: 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29   else if( !aff )
1070: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
1080: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
1090: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
10a0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
10b0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
10c0: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
10d0: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
10e0: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
10f0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1100: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1110: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1120: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1130: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1140: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1150: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
1160: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1170: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
1180: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
1190: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
11a0: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
11b0: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
11c0: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
11d0: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
11e0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
11f0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1200: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1210: 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72  FF_NONE:.      r
1220: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1230: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1240: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
1250: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
1260: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
1270: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1280: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1290: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
12a0: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
12b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12c0: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
12d0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
12e0: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
12f0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
1300: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
1310: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
1320: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
1330: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
1340: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
1350: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
1360: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
1370: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
1380: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
1390: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
13a0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
13b0: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 73  xpr2);.  aff = s
13c0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13d0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
13e0: 66 29 20 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3b  f) | jumpIfNull;
13f0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
1400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1410: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1420: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1430: 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ce that should b
1440: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62  e used by.** a b
1450: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1460: 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72   operator compar
1470: 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ing pLeft and pR
1480: 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ight..**.** If t
1490: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70  he left hand exp
14a0: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
14b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14c0: 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69   type, then it i
14d0: 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72  s.** used. Other
14e0: 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  wise the collati
14f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
1500: 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65  the right hand e
1510: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
1520: 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66  used, or the def
1530: 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66  ault (BINARY) if
1540: 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73   neither express
1550: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1560: 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a  ing.** type..**.
1570: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67  ** Argument pRig
1580: 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66  ht (but not pLef
1590: 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c  t) may be a null
15a0: 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69   pointer. In thi
15b0: 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73  s case,.** it is
15c0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
15d0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
15e0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
15f0: 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73  eCollSeq(.  Pars
1600: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
1610: 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78  pr *pLeft, .  Ex
1620: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
1630: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1640: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1650: 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  );.  if( pLeft->
1660: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1670: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73  llate ){.    ass
1680: 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ert( pLeft->pCol
1690: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
16a0: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20   pLeft->pColl;. 
16b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
16c0: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  t && pRight->fla
16d0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
16e0: 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  te ){.    assert
16f0: 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20  ( pRight->pColl 
1700: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70  );.    pColl = p
1710: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
1720: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c  }else{.    pColl
1730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1740: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
1750: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70  eft);.    if( !p
1760: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
1770: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1780: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1790: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a   pRight);.    }.
17a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
17b0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ll;.}../*.** Gen
17c0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
17d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17e0: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
17f0: 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  int codeCompare(
1800: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1810: 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  ,    /* The pars
1820: 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65  ing (and code ge
1830: 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78  nerating) contex
1840: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  t */.  Expr *pLe
1850: 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ft,      /* The 
1860: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
1870: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
1880: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1890: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
18a0: 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20  t opcode,       
18b0: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
18c0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  n opcode */.  in
18d0: 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20  t in1, int in2, 
18e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
18f0: 69 6e 67 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a  ing operands */.
1900: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1910: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1920: 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   if true.  */.  
1930: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1940: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75    /* If true, ju
1950: 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  mp if either ope
1960: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  rand is NULL */.
1970: 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a 20 20 69  ){.  int p5;.  i
1980: 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53  nt addr;.  CollS
1990: 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20  eq *p4;..  p4 = 
19a0: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
19b0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
19c0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
19d0: 74 29 3b 0a 20 20 70 35 20 3d 20 62 69 6e 61 72  t);.  p5 = binar
19e0: 79 43 6f 6d 70 61 72 65 50 35 28 70 4c 65 66 74  yCompareP5(pLeft
19f0: 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66  , pRight, jumpIf
1a00: 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20  Null);.  addr = 
1a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a20: 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  4(pParse->pVdbe,
1a30: 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65   opcode, in2, de
1a40: 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20 20 20 20  st, in1,.       
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 28 76 6f 69 64 2a 29 70 34 2c 20 50      (void*)p4, P
1a70: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71  4_COLLSEQ);.  sq
1a80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a90: 35 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  5(pParse->pVdbe,
1aa0: 20 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61   p5);.  return a
1ab0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ddr;.}../*.** Co
1ac0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
1ad0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
1ae0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
1af0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
1b00: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
1b10: 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  de is obtained f
1b20: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1b30: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
1b40: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
1b50: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1b60: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
1b70: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
1b80: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
1b90: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1ba0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1bb0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
1bc0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
1bd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1be0: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
1bf0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c10: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
1c20: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
1c30: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
1c40: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
1c50: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
1c60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
1c70: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1c80: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
1c90: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
1ca0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
1cb0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
1cc0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1cd0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ce0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
1cf0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1d00: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
1d10: 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74  loc fails, delet
1d20: 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  e pLeft and pRig
1d30: 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20  ht. Expressions 
1d40: 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a  passed to .    *
1d50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1d60: 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61  must always be a
1d70: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71  llocated with sq
1d80: 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20  lite3Expr() for 
1d90: 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61  this .    ** rea
1da0: 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  son. .    */.   
1db0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1dc0: 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  te(pLeft);.    s
1dd0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1de0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
1df0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
1e00: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
1e10: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1e20: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1e30: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70  ht = pRight;.  p
1e40: 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a  New->iAgg = -1;.
1e50: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
1e60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1e70: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1e80: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
1e90: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
1ea0: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oken;.  }else if
1eb0: 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69  ( pLeft ){.    i
1ec0: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
1ee0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
1ef0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
1f00: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  span);.      if(
1f10: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26   pRight->flags &
1f20: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1f30: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1f40: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43  flags |= EP_ExpC
1f50: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
1f60: 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52  pNew->pColl = pR
1f70: 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  ight->pColl;.   
1f80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f90: 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  f( pLeft->flags 
1fa0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
1fb0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  ){.      pNew->f
1fc0: 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
1fd0: 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65  llate;.      pNe
1fe0: 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  w->pColl = pLeft
1ff0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ->pColl;.    }. 
2000: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70   }..  sqlite3Exp
2010: 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77 29  rSetHeight(pNew)
2020: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
2030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20  .}../*.** Works 
2040: 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72  like sqlite3Expr
2050: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
2060: 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74 72 61  t takes an extra
2070: 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67 75 6d   Parse*.** argum
2080: 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69 65 73  ent and notifies
2090: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63  connection objec
20b0: 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  t if malloc fail
20c0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
20d0: 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73  te3PExpr(.  Pars
20e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
2100: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
2110: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2120: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2130: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2140: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
2150: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
2160: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
2170: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
2180: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
2190: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
21a0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
21b0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
21c0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  en */.){.  retur
21d0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  n sqlite3Expr(pP
21e0: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 4c  arse->db, op, pL
21f0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f  eft, pRight, pTo
2200: 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ken);.}../*.** W
2210: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
2220: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
2230: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
2240: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
2250: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
2260: 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23 32  ke this:   #1 #2
2270: 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d   ...  These term
2280: 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69 73  s refer to regis
2290: 74 65 72 73 0a 2a 2a 20 69 6e 20 74 68 65 20 76  ters.** in the v
22a0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
22b0: 20 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20   #N is the N-th 
22c0: 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
22d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22e0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
22f0: 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74  rser to deal wit
2300: 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65  h on of those te
2310: 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64  rms..** It immed
2320: 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73  iately generates
2330: 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74   code to store t
2340: 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65  he value in a me
2350: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
2360: 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e  * The returns an
2370: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2380: 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78   will code to ex
2390: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
23a0: 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d  from.** that mem
23b0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20  ory location as 
23c0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  needed..*/.Expr 
23d0: 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72  *sqlite3Register
23e0: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
23f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
2400: 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  n){.  Vdbe *v = 
2410: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2420: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
2430: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
2440: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2450: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2460: 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73   "near \"%T\": s
2470: 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54  yntax error", pT
2480: 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  oken);.    retur
2490: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
24a0: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
24b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
24c0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
24d0: 6e 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  n 0;.  p = sqlit
24e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
24f0: 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20  TK_REGISTER, 0, 
2500: 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  0, pToken);.  if
2510: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ( p==0 ){.    re
2520: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 0;  /* Mall
2530: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
2540: 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 61  .  p->iTable = a
2550: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
2560: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 72 65 74  en->z[1]);.  ret
2570: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2580: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
2590: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
25a0: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
25b0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
25c0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
25d0: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
25e0: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
25f0: 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ion..*/.Expr *sq
2600: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c  lite3ExprAnd(sql
2610: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
2620: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
2630: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
2640: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
2650: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
2660: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
2670: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2680: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Left;.  }else{. 
2690: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
26a0: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4e 44  3Expr(db, TK_AND
26b0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
26c0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
26d0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
26e0: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
26f0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2700: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2710: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2720: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
2730: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2740: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
2750: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
2760: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
2770: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
2780: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2790: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
27a0: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
27b0: 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20  && pRight->z && 
27c0: 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
27d0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 64  assert( pLeft->d
27e0: 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e  yn==0 || pLeft->
27f0: 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29  z[pLeft->n]==0 )
2800: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
2810: 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68  >dyn==0 && pRigh
2820: 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  t->dyn==0 ){.   
2830: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
2840: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
2850: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
2860: 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28   = pRight->n + (
2870: 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66  pRight->z - pLef
2880: 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t->z);.    }else
2890: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
28a0: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d  pan.z = 0;.    }
28b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
28c0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
28d0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
28e0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
28f0: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
2900: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
2910: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
2920: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
2930: 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
2940: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
2950: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
2960: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ew;.  assert( pT
2970: 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d  oken );.  pNew =
2980: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2990: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
29a0: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
29b0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
29c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
29d0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
29e0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
29f0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
2a00: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a20: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2a30: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
2a40: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
2a50: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  st;.  assert( pT
2a60: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
2a70: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
2a80: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d  *pToken;.  pNew-
2a90: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
2aa0: 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 45  ken;..  sqlite3E
2ab0: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65  xprSetHeight(pNe
2ac0: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
2ad0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
2ae0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
2af0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
2b00: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2b10: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2b20: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2b30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2b40: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
2b50: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
2b60: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
2b70: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
2b80: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
2b90: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2ba0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
2bb0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
2bc0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
2bd0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
2be0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
2bf0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
2c00: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2c10: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2c20: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2c30: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2c40: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2c50: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2c60: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
2c70: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2c80: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2c90: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
2ca0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
2cb0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
2cc0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2cd0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2ce0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2cf0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2d00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2d10: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2d20: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2d30: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2d40: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2d50: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2d60: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
2d70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2d80: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
2d90: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 73 71  en *pToken;.  sq
2da0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2db0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
2dc0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
2dd0: 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45  ;.  pToken = &pE
2de0: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73  xpr->token;.  as
2df0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e  sert( pToken->n>
2e00: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2e10: 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a  pToken->z!=0 );.
2e20: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2e30: 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69  ->z[0]!=0 );.  i
2e40: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20  f( pToken->n==1 
2e50: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
2e60: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
2e70: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
2e80: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
2e90: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45 78 70  mber */.    pExp
2ea0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
2eb0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65  arse->nVar;.  }e
2ec0: 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e  lse if( pToken->
2ed0: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
2ee0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
2ef0: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
2f00: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
2f10: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
2f20: 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20  d.    ** use it 
2f30: 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  as the variable 
2f40: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e  number */.    in
2f50: 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  t i;.    pExpr->
2f60: 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f  iTable = i = ato
2f70: 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e  i((char*)&pToken
2f80: 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  ->z[1]);.    if(
2f90: 20 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c   i<1 || i>db->aL
2fa0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2fb0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
2fc0: 52 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  R] ){.      sqli
2fd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fe0: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
2ff0: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
3000: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
3010: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
3020: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3030: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
3040: 42 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  BER]);.    }.   
3050: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
3060: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
3070: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
3080: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3090: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
30a0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
30b0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
30c0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
30d0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
30e0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
30f0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
3100: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
3110: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
3120: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
3130: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
3140: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
3150: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
3160: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
3170: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
3180: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
3190: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
31a0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
31b0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
31c0: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
31d0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
31e0: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
31f0: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3200: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3210: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3220: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
3230: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3240: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3250: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
3260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3270: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
3280: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
3290: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
32a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
32b0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
32c0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
32d0: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
32e0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
32f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3300: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3310: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3320: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
3330: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3340: 3e 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20  >apVarExpr =.   
3350: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3360: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
3370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
3380: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
3390: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
33a0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
33b0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
33c0: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
33d0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
33e0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
33f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
3400: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
3410: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
3420: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
3430: 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20  e->apVarExpr!=0 
3440: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3450: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61  e->apVarExpr[pPa
3460: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d  rse->nVarExpr++]
3470: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
3480: 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69  }.    }.  } .  i
3490: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72  f( !pParse->nErr
34a0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   && pParse->nVar
34b0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
34c0: 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
34d0: 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20  E_NUMBER] ){.   
34e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
34f0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
3500: 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  ny SQL variables
3510: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
3520: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
3530: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
3540: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
3550: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3560: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
3570: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
3580: 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64  .  if( p->span.d
3590: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
35a0: 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  e((char*)p->span
35b0: 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  .z);.  if( p->to
35c0: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
35d0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d  3_free((char*)p-
35e0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
35f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3600: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
3610: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3620: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
3630: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3640: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
3650: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3660: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
3670: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3680: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
3690: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
36a0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
36b0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
36c0: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
36d0: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
36e0: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
36f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3700: 44 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69  DequoteExpr(sqli
3710: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
3720: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
3730: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
3740: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
3750: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3760: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
3770: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
3780: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3790: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
37a0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
37b0: 64 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26  db, &p->token, &
37c0: 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  p->token);.  }. 
37d0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
37e0: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
37f0: 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  z);.}.../*.** Th
3800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
3810: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
3820: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
3830: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
3840: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
3850: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
3860: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
3870: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
3880: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
3890: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
38a0: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
38b0: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
38c0: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
38d0: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
38e0: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
38f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
3900: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
3910: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
3920: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
3930: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
3940: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
3950: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
3960: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
3970: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
3980: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
3990: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
39a0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
39b0: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
39c0: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
39d0: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
39e0: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
39f0: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
3a00: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78  uplicated..*/.Ex
3a10: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
3a20: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
3a30: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3a40: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3a50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3a60: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
3a70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
3a80: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3a90: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3aa0: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
3ab0: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
3ac0: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
3ad0: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
3ae0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3af0: 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  z = (u8*)sqlite3
3b00: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
3b10: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
3b20: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
3b30: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
3b40: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
3b50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
3b60: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
3b70: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
3b80: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
3b90: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
3ba0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
3bb0: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
3bc0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
3bd0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69  prDup(db, p->pRi
3be0: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
3bf0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
3c00: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
3c10: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
3c20: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
3c30: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
3c40: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
3c50: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
3c60: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
3c70: 70 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  py(sqlite3 *db, 
3c80: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
3c90: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
3ca0: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
3cb0: 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29  te3_free((char*)
3cc0: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
3cd0: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
3ce0: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
3cf0: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28  ;.    pTo->z = (
3d00: 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72  u8*)sqlite3DbStr
3d10: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
3d20: 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d  pFrom->z, pFrom-
3d30: 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79  >n);.    pTo->dy
3d40: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
3d50: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a      pTo->z = 0;.
3d60: 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a    }.}.ExprList *
3d70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3d80: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
3d90: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
3da0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
3db0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
3dc0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
3dd0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
3de0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3df0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3e00: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3e10: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
3e20: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
3e30: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3e40: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43  n 0;.  pNew->iEC
3e50: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65  ursor = 0;.  pNe
3e60: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
3e70: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
3e80: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
3e90: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
3ea0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
3eb0: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
3ec0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
3ed0: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
3ee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3ef0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
3f00: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
3f10: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
3f20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
3f30: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
3f40: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
3f50: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
3f60: 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20  , *pOldExpr;.   
3f70: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
3f80: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
3f90: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
3fa0: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
3fb0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
3fc0: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
3fd0: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
3fe0: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
3ff0: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
4000: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
4010: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
4020: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
4030: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
4040: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
4050: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
4060: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
4070: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
4080: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
4090: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
40a0: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
40b0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
40c0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
40d0: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
40e0: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  NewExpr->span, &
40f0: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b  pOldExpr->span);
4100: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4110: 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c  t( pNewExpr==0 |
4120: 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  | pNewExpr->span
4130: 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  .z!=0 .         
4140: 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e     || pOldExpr->
4150: 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20  span.z==0.      
4160: 20 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c        || db->mal
4170: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
4180: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
4190: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
41a0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
41b0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
41c0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
41d0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
41e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
41f0: 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  gg = pOldItem->i
4200: 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sAgg;.    pItem-
4210: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >done = 0;.  }. 
4220: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4230: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
4240: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
4250: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
4260: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
4270: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
4280: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
4290: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
42a0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
42b0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
42c0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
42d0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
42e0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
42f0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
4300: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
4310: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
4320: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4330: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
4340: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4350: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
4360: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
4370: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4380: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
4390: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
43a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
43b0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
43c0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
43d0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
43e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
43f0: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
4400: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
4410: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
4420: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
4430: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
4440: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
4450: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
4460: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
4470: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
4480: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
4490: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
44a0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
44b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
44c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
44d0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
44e0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
44f0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4500: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
4510: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
4520: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
4530: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
4540: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
4550: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
4560: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  b, pOldItem->zDa
4570: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
4580: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
4590: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
45a0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
45b0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
45c0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
45d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
45e0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
45f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4600: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
4610: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
4620: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
4630: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
4640: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
4650: 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  NewItem->isPopul
4660: 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ated = pOldItem-
4670: 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20  >isPopulated;.  
4680: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
4690: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
46a0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
46b0: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
46c0: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
46d0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
46e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
46f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
4700: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
4710: 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ct);.    pNewIte
4720: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
4730: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
4740: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
4750: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
4760: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
4770: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4780: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
4790: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
47a0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
47b0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
47c0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
47d0: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
47e0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
47f0: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
4800: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
4810: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
4820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4830: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4840: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4850: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
4860: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
4870: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
4880: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
4890: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
48a0: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  New->a = sqlite3
48b0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
48c0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
48d0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
48e0: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
48f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4900: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
4910: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   0;.  }.  for(i=
4920: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
4930: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
4940: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
4950: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
4960: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
4970: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
4980: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
4990: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
49a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
49b0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
49c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
49d0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
49e0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
49f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4a00: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
4a10: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
4a20: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
4a30: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
4a40: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
4a50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4a70: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
4a80: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
4a90: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4aa0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  n 0;.  pNew->isD
4ab0: 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
4ac0: 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d  istinct;.  pNew-
4ad0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
4ae0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
4af0: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70   p->pEList);.  p
4b00: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
4b10: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62  te3SrcListDup(db
4b20: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e  , p->pSrc);.  pN
4b30: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
4b40: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
4b50: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
4b60: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
4b70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4b80: 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  p(db, p->pGroupB
4b90: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  y);.  pNew->pHav
4ba0: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
4bb0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76  rDup(db, p->pHav
4bc0: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
4bd0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
4be0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
4bf0: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
4c00: 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70  pNew->op = p->op
4c10: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
4c20: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
4c30: 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  Dup(db, p->pPrio
4c40: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
4c50: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
4c60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
4c70: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  t);.  pNew->pOff
4c80: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
4c90: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
4ca0: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
4cb0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
4cc0: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
4cd0: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
4ce0: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
4cf0: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
4d00: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4d10: 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20   pNew->usesEphm 
4d20: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
4d30: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
4d40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
4d50: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
4d60: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
4d70: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
4d80: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
4d90: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4da0: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
4db0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
4dc0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
4dd0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4de0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
4df0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61   Select *p){.  a
4e00: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
4e10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
4e20: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
4e30: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
4e40: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
4e50: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
4e60: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
4e70: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4e80: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4e90: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4ea0: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4eb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4ec0: 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a  ppend(.  Parse *
4ed0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4ee0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
4ef0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
4f00: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
4f10: 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63   /* List to whic
4f20: 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  h to append. Mig
4f30: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
4f40: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
4f50: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
4f60: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65  ssion to be appe
4f70: 6e 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  nded */.  Token 
4f80: 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *pName          
4f90: 20 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20    /* AS keyword 
4fa0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
4fb0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
4fc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4fd0: 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  >db;.  if( pList
4fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
4ff0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5000: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
5010: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
5020: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
5030: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
5040: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
5050: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
5060: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
5070: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
5080: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
5090: 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  r ){.    struct 
50a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
50b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  ;.    int n = pL
50c0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
50d0: 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  4;.    a = sqlit
50e0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
50f0: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
5100: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
5110: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
5120: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5130: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
5140: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
5150: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
5160: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
5170: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
5180: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
5190: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
51a0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
51b0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
51c0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
51d0: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
51e0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
51f0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
5200: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
5210: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5220: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5230: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
5240: 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20   = pExpr;.  }.  
5250: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e  return pList;..n
5260: 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a  o_mem:     .  /*
5270: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
5280: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
5290: 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20  has failed. */. 
52a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
52b0: 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c  te(pExpr);.  sql
52c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
52d0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
52e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
52f0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
5300: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
5310: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
5320: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
5330: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
5340: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
5350: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
5360: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
5370: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
5380: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
5390: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
53a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
53b0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
53c0: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
53d0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
53e0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 69  MIT_COLUMN];.  i
53f0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
5400: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
5410: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5420: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
5430: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
5440: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
5450: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20  .  }.}.../* The 
5460: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20  following three 
5470: 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65 69 67 68  functions, heigh
5480: 74 4f 66 45 78 70 72 28 29 2c 20 68 65 69 67 68  tOfExpr(), heigh
5490: 74 4f 66 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  tOfExprList().**
54a0: 20 61 6e 64 20 68 65 69 67 68 74 4f 66 53 65 6c   and heightOfSel
54b0: 65 63 74 28 29 2c 20 61 72 65 20 75 73 65 64 20  ect(), are used 
54c0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
54d0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 0a   maximum height.
54e0: 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ** of any expres
54f0: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5500: 6e 63 65 64 20 62 79 20 74 68 65 20 73 74 72 75  nced by the stru
5510: 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20  cture passed as 
5520: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 61 72 67  the.** first arg
5530: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
5540: 74 68 69 73 20 6d 61 78 69 6d 75 6d 20 68 65 69  this maximum hei
5550: 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ght is greater t
5560: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
5570: 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
5580: 20 74 6f 20 62 79 20 70 6e 48 65 69 67 68 74 2c   to by pnHeight,
5590: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
55a0: 6d 65 74 65 72 2c 20 74 68 65 6e 20 73 65 74 20  meter, then set 
55b0: 2a 70 6e 48 65 69 67 68 74 20 74 6f 20 74 68 61  *pnHeight to tha
55c0: 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  t.** value..*/.s
55d0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68  tatic void heigh
55e0: 74 4f 66 45 78 70 72 28 45 78 70 72 20 2a 70 2c  tOfExpr(Expr *p,
55f0: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5600: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5610: 69 66 28 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a  if( p->nHeight>*
5620: 70 6e 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20  pnHeight ){.    
5630: 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 2d    *pnHeight = p-
5640: 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a  >nHeight;.    }.
5650: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5660: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  d heightOfExprLi
5670: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
5680: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
5690: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
56a0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
56b0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
56c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65 69 67 68  ++){.      heigh
56d0: 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e  tOfExpr(p->a[i].
56e0: 70 45 78 70 72 2c 20 70 6e 48 65 69 67 68 74 29  pExpr, pnHeight)
56f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
5700: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
5710: 4f 66 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  OfSelect(Select 
5720: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
5730: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
5740: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5750: 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e 48 65 69  p->pWhere, pnHei
5760: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5770: 4f 66 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  OfExpr(p->pHavin
5780: 67 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  g, pnHeight);.  
5790: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57a0: 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67  ->pLimit, pnHeig
57b0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
57c0: 66 45 78 70 72 28 70 2d 3e 70 4f 66 66 73 65 74  fExpr(p->pOffset
57d0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
57e0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
57f0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48  t(p->pEList, pnH
5800: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5810: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5820: 70 47 72 6f 75 70 42 79 2c 20 70 6e 48 65 69 67  pGroupBy, pnHeig
5830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5840: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  fExprList(p->pOr
5850: 64 65 72 42 79 2c 20 70 6e 48 65 69 67 68 74 29  derBy, pnHeight)
5860: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65  ;.    heightOfSe
5870: 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20  lect(p->pPrior, 
5880: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  pnHeight);.  }.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
58a0: 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72  Expr.nHeight var
58b0: 69 61 62 6c 65 20 69 6e 20 74 68 65 20 73 74 72  iable in the str
58c0: 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
58d0: 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   an .** argument
58e0: 2e 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  . An expression 
58f0: 77 69 74 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e  with no children
5900: 2c 20 45 78 70 72 2e 70 4c 69 73 74 20 6f 72 20  , Expr.pList or 
5910: 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c 65 63 74  .** Expr.pSelect
5920: 20 6d 65 6d 62 65 72 20 68 61 73 20 61 20 68 65   member has a he
5930: 69 67 68 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f  ight of 1. Any o
5940: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
5950: 2a 2a 20 68 61 73 20 61 20 68 65 69 67 68 74 20  ** has a height 
5960: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61 78  equal to the max
5970: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
5980: 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66  ny other .** ref
5990: 65 72 65 6e 63 65 64 20 45 78 70 72 20 70 6c 75  erenced Expr plu
59a0: 73 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  s one..*/.void s
59b0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
59c0: 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ght(Expr *p){.  
59d0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
59e0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
59f0: 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65 69 67  p->pLeft, &nHeig
5a00: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5a10: 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c 20 26  xpr(p->pRight, &
5a20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5a30: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5a40: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
5a50: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
5a60: 63 74 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26  ct(p->pSelect, &
5a70: 6e 48 65 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e  nHeight);.  p->n
5a80: 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74  Height = nHeight
5a90: 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   + 1;.}../*.** R
5aa0: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
5ab0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
5ac0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5ad0: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79  referenced.** by
5ae0: 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   the select stat
5af0: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
5b00: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
5b10: 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
5b20: 74 45 78 70 72 48 65 69 67 68 74 28 53 65 6c 65  tExprHeight(Sele
5b30: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  ct *p){.  int nH
5b40: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5b50: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26  ghtOfSelect(p, &
5b60: 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75  nHeight);.  retu
5b70: 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 0a 2f  rn nHeight;.}../
5b80: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
5b90: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
5ba0: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
5bb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5bc0: 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70  lete(ExprList *p
5bd0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
5be0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5bf0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
5c00: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
5c10: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
5c20: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
5c30: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
5c40: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
5c50: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
5c60: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
5c70: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
5c80: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
5c90: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
5ca0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5cb0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
5cc0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
5cd0: 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  te(pItem->pExpr)
5ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5cf0: 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
5d00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5d10: 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  free(pList->a);.
5d20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5d30: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
5d40: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
5d50: 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78  on tree.  Call x
5d60: 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f  Func for each no
5d70: 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a  de visited..**.*
5d80: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
5d90: 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65  ue from xFunc de
5da0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
5db0: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
5dc0: 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d  ontinues..** 0 m
5dd0: 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61  eans continue wa
5de0: 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20  lking the tree. 
5df0: 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20   1 means do not 
5e00: 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a  walk children.**
5e10: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
5e20: 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75  node but continu
5e30: 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e  e with siblings.
5e40: 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f    2 means abando
5e50: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61  n.** the tree wa
5e60: 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a  lk completely..*
5e70: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
5e80: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20  value from this 
5e90: 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20  routine is 1 to 
5ea0: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
5eb0: 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74   walk.** and 0 t
5ec0: 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
5ed0: 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20  * NOTICE:  This 
5ee0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f  routine does *no
5ef0: 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20  t* descend into 
5f00: 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73  subqueries..*/.s
5f10: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
5f20: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
5f30: 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20  *, int (*)(void 
5f40: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
5f50: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
5f60: 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72  alkExprTree(Expr
5f70: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78   *pExpr, int (*x
5f80: 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72  Func)(void*,Expr
5f90: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
5fa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
5fb0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
5fc0: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78  rn 0;.  rc = (*x
5fd0: 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70  Func)(pArg, pExp
5fe0: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  r);.  if( rc==0 
5ff0: 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  ){.    if( walkE
6000: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
6010: 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  Left, xFunc, pAr
6020: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
6030: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
6040: 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ree(pExpr->pRigh
6050: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
6060: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
6070: 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  if( walkExprList
6080: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78  (pExpr->pList, x
6090: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
60a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
60b0: 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a  turn rc>1;.}../*
60c0: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
60d0: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
60e0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
60f0: 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  list p..*/.stati
6100: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69  c int walkExprLi
6110: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
6120: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
6130: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
6140: 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
6150: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
6160: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6170: 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
6180: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70  urn 0;.  for(i=p
6190: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
61a0: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
61b0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
61c0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49   walkExprTree(pI
61d0: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e  tem->pExpr, xFun
61e0: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
61f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
6200: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  n 0;.}../*.** Ca
6210: 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  ll walkExprTree(
6220: 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
6230: 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74  ession in Select
6240: 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e   p, not includin
6250: 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  g.** expressions
6260: 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
6270: 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e  f sub-selects in
6280: 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65   any FROM clause
6290: 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a   or the LIMIT.**
62a0: 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65   or OFFSET expre
62b0: 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74  ssions...*/.stat
62c0: 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63  ic int walkSelec
62d0: 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c  tExpr(Select *p,
62e0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
62f0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
6300: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c  id *pArg){.  wal
6310: 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  kExprList(p->pEL
6320: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
6330: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
6340: 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75  e(p->pWhere, xFu
6350: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
6360: 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  kExprList(p->pGr
6370: 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41  oupBy, xFunc, pA
6380: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  rg);.  walkExprT
6390: 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ree(p->pHaving, 
63a0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
63b0: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
63c0: 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c  pOrderBy, xFunc,
63d0: 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 2d   pArg);.  if( p-
63e0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 77  >pPrior ){.    w
63f0: 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 2d  alkSelectExpr(p-
6400: 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c 20  >pPrior, xFunc, 
6410: 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pArg);.  }.  ret
6420: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
6430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6440: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
6450: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
6460: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
6470: 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61  pArg is really a
6480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
6490: 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63  nteger.  If we c
64a0: 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69  an tell by looki
64b0: 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74  ng.** at pExpr t
64c0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
64d0: 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  on that contains
64e0: 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20   pExpr is not a 
64f0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72  constant.** expr
6500: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74  ession, then set
6510: 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20   *pArg to 0 and 
6520: 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e  return 2 to aban
6530: 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c  don the tree wal
6540: 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64  k..** If pExpr d
6550: 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  oes does not dis
6560: 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72  qualify the expr
6570: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e  ession from bein
6580: 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  g a constant.** 
6590: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
65a0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c  .**.** After wal
65b0: 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74  king the whole t
65c0: 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73  ree, if no nodes
65d0: 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20   are found that 
65e0: 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68  disqualify.** th
65f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  e expression as 
6600: 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77  constant, then w
6610: 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f  e assume the who
6620: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  le expression.**
6630: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53   is constant.  S
6640: 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  ee sqlite3ExprIs
6650: 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61  Constant() for a
6660: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
6670: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
6680: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
6690: 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41  onstant(void *pA
66a0: 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
66b0: 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28 69  {.  int *pN = (i
66c0: 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a 20  nt*)pArg;..  /* 
66d0: 49 66 20 2a 70 41 72 67 20 69 73 20 33 20 74 68  If *pArg is 3 th
66e0: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
66f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
6700: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
6710: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
6720: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
6730: 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65  join disqualifie
6740: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
6750: 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67  .  ** from being
6760: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73   considered cons
6770: 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 28  tant. */.  if( (
6780: 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72 48  *pN)==3 && ExprH
6790: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
67a0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
67b0: 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20 30  ) ){.    *pN = 0
67c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
67d0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
67e0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
67f0: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
6800: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
6810: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
6820: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
6830: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
6840: 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a  and *pArg==2 */.
6850: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
6860: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
6870: 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75 72  (*pN)==2 ) retur
6880: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
6890: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
68a0: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
68b0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
68c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
68d0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
68e0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
68f0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
6900: 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN:.#ifndef SQL
6910: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6920: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
6930: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
6940: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
6950: 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a  .      *pN = 0;.
6960: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
6970: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
6980: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
6990: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
69a0: 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20      *pN = 0;.   
69b0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
69c0: 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75       }.    defau
69d0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
69e0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
69f0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
6a00: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
6a10: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6a20: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
6a30: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
6a40: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
6a50: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
6a60: 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  calls..**.** For
6a70: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
6a80: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
6a90: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
6aa0: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
6ab0: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
6ac0: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
6ad0: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
6ae0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
6af0: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
6b00: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
6b10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
6b20: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
6b30: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31   int isConst = 1
6b40: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
6b50: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
6b60: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
6b70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
6b80: 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  nst;.}../*.** Wa
6b90: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
6ba0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
6bb0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
6bc0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
6bd0: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
6be0: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
6bf0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
6c00: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
6c10: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
6c20: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
6c30: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
6c40: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
6c50: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
6c60: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
6c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
6c80: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
6c90: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
6ca0: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b  int isConst = 3;
6cb0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6cc0: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6cd0: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6ce0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6cf0: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
6d00: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
6d10: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
6d20: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6d30: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
6d40: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
6d50: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
6d60: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
6d70: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
6d80: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
6d90: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
6da0: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
6db0: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
6dc0: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
6dd0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
6de0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
6df0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
6e00: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
6e10: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
6e20: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
6e30: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
6e40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
6e50: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
6e60: 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  tion(Expr *p){. 
6e70: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32   int isConst = 2
6e80: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
6e90: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
6ea0: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
6eb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
6ec0: 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nst!=0;.}../*.**
6ed0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
6ee0: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
6ef0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
6f00: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
6f10: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
6f20: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
6f30: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
6f40: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
6f50: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
6f60: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
6f70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6f80: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
6f90: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
6fa0: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
6fb0: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
6fc0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
6fd0: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
6fe0: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
6ff0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
7000: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
7010: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
7020: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
7030: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7040: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
7050: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
7060: 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d  tInt32((char*)p-
7070: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65  >token.z, pValue
7080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
7090: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
70a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
70b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
70c0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LUS: {.      ret
70d0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49  urn sqlite3ExprI
70e0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
70f0: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
7100: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
7110: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
7120: 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
7130: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7140: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
7150: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) ){.        *pV
7160: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
7170: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7180: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
71a0: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
71b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
71c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
71d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
71e0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
71f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
7200: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
7210: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
7220: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
7230: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
7240: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
7250: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7260: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
7270: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
7280: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7290: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
72a0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
72b0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
72c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
72d0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
72e0: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
72f0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
7300: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
7310: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
7320: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
7330: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
7340: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
7350: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
7360: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
7370: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
7380: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
7390: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
73a0: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
73b0: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
73c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
73d0: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
73e0: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
73f0: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
7400: 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20  ase holding.**  
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65         the table
7430: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
7440: 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74  Table        Set
7450: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e   to the cursor n
7460: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7470: 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ble obtained.** 
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72          from pSr
74a0: 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78  cList..**    pEx
74b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20  pr->iColumn     
74c0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c    Set to the col
74d0: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
74e0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
74f0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
7500: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54          Set to T
7510: 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20  K_COLUMN..**    
7520: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20  pExpr->pLeft    
7530: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
7540: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
7550: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  to is deleted.**
7560: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
7570: 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70  t        Any exp
7580: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
7590: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
75a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62  d..**.** The pDb
75b0: 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d  Token is the nam
75c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
75d0: 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68  e (the "X").  Th
75e0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
75f0: 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  ** NULL meaning 
7600: 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20  that name is of 
7610: 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20  the form Y.Z or 
7620: 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c  Z.  Any availabl
7630: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61  e database.** ca
7640: 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20  n be used.  The 
7650: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74  pTableToken is t
7660: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
7670: 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20  able (the "Y"). 
7680: 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63   This.** value c
7690: 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44  an be NULL if pD
76a0: 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e  bToken is also N
76b0: 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54  ULL.  If pTableT
76c0: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a  oken is NULL it.
76d0: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
76e0: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61  e form of the na
76f0: 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74  me is Z and that
7700: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e   columns from an
7710: 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62  y table.** can b
7720: 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e used..**.** If
7730: 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74   the name cannot
7740: 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61   be resolved una
7750: 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76  mbiguously, leav
7760: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
7770: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
7780: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
7790: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
77a0: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  o on success..*/
77b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b  .static int look
77c0: 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  upName(.  Parse 
77d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
77e0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
77f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
7800: 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20   *pDbToken,     
7810: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7820: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
7830: 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c  ng table, or NUL
7840: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
7850: 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e  ableToken,  /* N
7860: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e  ame of table con
7870: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  taining column, 
7880: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
7890: 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  en *pColumnToken
78a0: 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  , /* Name of the
78b0: 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61   column. */.  Na
78c0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
78d0: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
78e0: 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72  ontext used to r
78f0: 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20  esolve the name 
7900: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
7920: 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65  e this EXPR node
7930: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65   point to the se
7940: 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  lected column */
7950: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
7960: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
7970: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7980: 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20  se.  The "X" in 
7990: 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  X.Y.Z */.  char 
79a0: 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *zTab = 0;      
79b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
79c0: 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69  able.  The "Y" i
79d0: 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a  n X.Y.Z or Y.Z *
79e0: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  /.  char *zCol =
79f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
7a00: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
7a10: 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e   The "Z" */.  in
7a20: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
7a30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7a40: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
7a50: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
7a60: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
7a70: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
7a80: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
7a90: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
7aa0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
7ab0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a   table names */.
7ac0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7ad0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
7ae0: 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  The database */.
7af0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7b00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20  _item *pItem;   
7b10: 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c      /* Use for l
7b20: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63  ooping over pSrc
7b30: 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20  List items */.  
7b40: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
7b50: 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tem *pMatch = 0;
7b60: 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e    /* The matchin
7b70: 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20  g pSrcList item 
7b80: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
7b90: 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20   *pTopNC = pNC; 
7ba0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
7bb0: 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74  namecontext in t
7bc0: 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68  he list */.  Sch
7bd0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30  ema *pSchema = 0
7be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7bf0: 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20  * Schema of the 
7c00: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20  expression */.. 
7c10: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
7c20: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
7c30: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
7c40: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
7c50: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
7c60: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
7c70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7c80: 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54   pDbToken);.  zT
7c90: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
7ca0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
7cb0: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
7cc0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
7cd0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43  FromToken(db, pC
7ce0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  olumnToken);.  i
7cf0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7d00: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
7d10: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
7d20: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
7d30: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
7d40: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
7d50: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
7d60: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
7d70: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
7d80: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7d90: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
7da0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
7db0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
7dc0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
7dd0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
7de0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
7df0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
7e00: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
7e10: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
7e20: 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  pCol;.  .       
7e30: 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
7e40: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
7e50: 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
7e60: 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
7e70: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7e80: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
7e90: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61  hema);.        a
7ea0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
7eb0: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
7ec0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
7ed0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
7ee0: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
7ef0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7f00: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
7f10: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
7f20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7f30: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
7f40: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
7f50: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
7f60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7f70: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
7f80: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7f90: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
7fa0: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  TabName==0 || sq
7fb0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
7fc0: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
7fd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7fe0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
7ff0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
8000: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  ICmp(db->aDb[iDb
8010: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
8020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8030: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8060: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
8070: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
8080: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8090: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
80a0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
80b0: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
80c0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
80d0: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
80e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  em;.        }.  
80f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
8100: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
8110: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
8120: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
8130: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8140: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
8150: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
8160: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
8170: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
8180: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
8190: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
81a0: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
81b0: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
81c0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
81d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
81e0: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
81f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
8200: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
8210: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
8220: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
8230: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;.            /
8240: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
8250: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
8260: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
8270: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
8280: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
8290: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
82a0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
82b0: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
82c0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
82d0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
82e0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
82f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
8300: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
8310: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20  _ExpCollate)==0 
8320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8330: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
8340: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
8350: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
8360: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
8370: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8380: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70 53          if( i<pS
8390: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29  rcList->nSrc-1 )
83a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
83b0: 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69  if( pItem[1].joi
83c0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
83d0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
83e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
83f0: 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64 20   match occurred 
8400: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
8410: 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a  e of a natural j
8420: 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oin,.           
8430: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69       ** then ski
8440: 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  p the right tabl
8450: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  e to avoid a dup
8460: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a  licate match */.
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
8490: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
84b0: 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20  e if( (pUsing = 
84c0: 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29  pItem[1].pUsing)
84d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
84e0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
84f0: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20 6f  s match occurs o
8500: 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  n a column that 
8510: 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  is in the USING 
8520: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 20  clause.         
8530: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
8540: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
8550: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
8560: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
8570: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
8580: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
8590: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
85a0: 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  h there. */.    
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
85c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
85d0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55     for(k=0; k<pU
85e0: 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b  sing->nId; k++){
85f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8600: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8610: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
8620: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
8630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8640: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
8650: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
8660: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8690: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
86a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
86b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
86c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
86d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
86e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8700: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8710: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
8720: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
8730: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73   not already res
8740: 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20  olved the name, 
8750: 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20  then maybe .    
8760: 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a  ** it is a new.*
8770: 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65   or old.* trigge
8780: 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  r argument refer
8790: 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ence.    */.    
87a0: 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54  if( zDb==0 && zT
87b0: 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20  ab!=0 && cnt==0 
87c0: 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  && pParse->trigS
87d0: 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  tack!=0 ){.     
87e0: 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70   TriggerStack *p
87f0: 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70  TriggerStack = p
8800: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
8810: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
8820: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  Tab = 0;.      u
8830: 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b 0a 20  32 *piColMask;. 
8840: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
8850: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
8860: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
8870: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
8880: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
8890: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
88a0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
88b0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
88c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
88d0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
88e0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
88f0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8900: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69  pTab;.        pi
8910: 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69  ColMask = &(pTri
8920: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 43 6f  ggerStack->newCo
8930: 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lMask);.      }e
8940: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
8950: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
8960: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
8970: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
8980: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
8990: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
89a0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
89b0: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
89c0: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
89d0: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
89e0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
89f0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
8a00: 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c  b;.        piCol
8a10: 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65  Mask = &(pTrigge
8a20: 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61  rStack->oldColMa
8a30: 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  sk);.      }..  
8a40: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20      if( pTab ){ 
8a50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
8a60: 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  l;.        Colum
8a70: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
8a80: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
8a90: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
8aa0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
8ab0: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
8ac0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
8ad0: 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol < pTab->nCol;
8ae0: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
8af0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
8b00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8b10: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
8b20: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
8b30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8b40: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
8b50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b  Col[iCol].zColl;
8b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
8b70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8b80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8b90: 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
8ba0: 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b 0a  ey ? -1 : iCol;.
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8bc0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
8bd0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
8be0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
8bf0: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
8c00: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
8c10: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
8c30: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
8c40: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
8c50: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
8c60: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
8c70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8c80: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
8c90: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
8ca0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
8cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8cc0: 2a 70 69 43 6f 6c 4d 61 73 6b 20 7c 3d 20 28 28  *piColMask |= ((
8cd0: 75 33 32 29 31 3c 3c 69 43 6f 6c 29 20 7c 20 28  u32)1<<iCol) | (
8ce0: 69 43 6f 6c 3e 3d 33 32 3f 30 78 66 66 66 66 66  iCol>=32?0xfffff
8cf0: 66 66 66 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  fff:0);.        
8d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8d10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8d20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8d30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
8d40: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
8d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8d60: 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  GER) */..    /*.
8d70: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
8d80: 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66  he name is a ref
8d90: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f  erence to the RO
8da0: 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  WID.    */.    i
8db0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
8dc0: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
8dd0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29  3IsRowid(zCol) )
8de0: 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b  {.      cnt = 1;
8df0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
8e00: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
8e10: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
8e20: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
8e30: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
8e40: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
8e50: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
8e60: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
8e70: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
8e80: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
8e90: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
8ea0: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
8eb0: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
8ec0: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
8ed0: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
8ee0: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
8ef0: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
8f00: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
8f10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
8f20: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
8f30: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
8f40: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
8f50: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
8f60: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
8f70: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
8f80: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
8f90: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
8fa0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
8fb0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
8fc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
8fd0: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
8fe0: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
8ff0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
9000: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
9010: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
9020: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
9030: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
9040: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
9050: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
9060: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
9070: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
9080: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  solved..    */. 
9090: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
90a0: 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e   (pEList = pNC->
90b0: 70 45 4c 69 73 74 29 21 3d 30 20 26 26 20 7a 54  pEList)!=0 && zT
90c0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ab==0 ){.      f
90d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
90e0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
90f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73         char *zAs
9100: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
9110: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
9120: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
9130: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
9140: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
9150: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75         Expr *pDu
9160: 70 2c 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20  p, *pOrig;.     
9170: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
9180: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
9190: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
91a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
91b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
91c0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st==0 );.       
91d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
91e0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
91f0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67 20            pOrig 
9200: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  = pEList->a[j].p
9210: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
9220: 69 66 28 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41  if( !pNC->allowA
9230: 67 67 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  gg && ExprHasPro
9240: 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f  perty(pOrig, EP_
9250: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
9260: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9270: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
9280: 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61  use of aliased a
9290: 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41  ggregate %s", zA
92a0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
92b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
92c0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
92d0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20  return 2;.      
92e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
92f0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
9300: 70 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 29  prDup(db, pOrig)
9310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
9320: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
9330: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
9340: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70              pDup
9350: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d  ->pColl = pExpr-
9360: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  >pColl;.        
9370: 20 20 20 20 70 44 75 70 2d 3e 66 6c 61 67 73 20      pDup->flags 
9380: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
9390: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
93a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
93b0: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  r->span.dyn ) sq
93c0: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
93d0: 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 29  *)pExpr->span.z)
93e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
93f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
9400: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
9410: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
9420: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  ken.z);.        
9430: 20 20 6d 65 6d 63 70 79 28 70 45 78 70 72 2c 20    memcpy(pExpr, 
9440: 70 44 75 70 2c 20 73 69 7a 65 6f 66 28 2a 70 45  pDup, sizeof(*pE
9450: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  xpr));.         
9460: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
9470: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  up);.          c
9480: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
9490: 20 20 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    pMatch = 0;.  
94a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
94b0: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
94c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  0 );.          g
94d0: 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  oto lookupname_e
94e0: 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nd_2;.        }.
94f0: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a        } .    }..
9500: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
9510: 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20  o the next name 
9520: 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f  context.  The lo
9530: 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65  op will exit whe
9540: 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  n either.    ** 
9550: 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20  we have a match 
9560: 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20  (cnt>0) or when 
9570: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61  we run out of na
9580: 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20  me contexts..   
9590: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
95a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20  =0 ){.      pNC 
95b0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
95c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
95d0: 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72  ** If X and Y ar
95e0: 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72  e NULL (in other
95f0: 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74   words if only t
9600: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a  he column name Z
9610: 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65   is.  ** supplie
9620: 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  d) and the value
9630: 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65   of Z is enclose
9640: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
9650: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20  es, then.  ** Z 
9660: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
9670: 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ral if it doesn'
9680: 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75  t match any colu
9690: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68  mn names.  In th
96a0: 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65  at.  ** case, we
96b0: 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20   need to return 
96c0: 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e  right away and n
96d0: 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  ot make any chan
96e0: 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70  ges to.  ** pExp
96f0: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63  r..  **.  ** Bec
9700: 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  ause no referenc
9710: 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75  e was made to ou
9720: 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68  ter contexts, th
9730: 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a  e pNC->nRef.  **
9740: 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
9750: 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63  changed in any c
9760: 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69  ontext..  */.  i
9770: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
9780: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
9790: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
97a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
97b0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72  ree(zCol);.    r
97c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
97d0: 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d  /*.  ** cnt==0 m
97e0: 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e  eans there was n
97f0: 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31  ot match.  cnt>1
9800: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72   means there wer
9810: 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f  e two or.  ** mo
9820: 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74  re matches.  Eit
9830: 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65  her way, we have
9840: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
9850: 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a    if( cnt!=1 ){.
9860: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9870: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
9880: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
9890: 63 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d  ch column" : "am
98a0: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
98b0: 61 6d 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ame";.    if( zD
98c0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
98d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
98e0: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73  e, "%s: %s.%s.%s
98f0: 22 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54  ", zErr, zDb, zT
9900: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  ab, zCol);.    }
9910: 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b  else if( zTab ){
9920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9940: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72  %s: %s.%s", zErr
9950: 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  , zTab, zCol);. 
9960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9970: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9980: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22  pParse, "%s: %s"
9990: 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20  , zErr, zCol);. 
99a0: 20 20 20 7d 0a 20 20 20 20 70 54 6f 70 4e 43 2d     }.    pTopNC-
99b0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nErr++;.  }..  
99c0: 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66  /* If a column f
99d0: 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70  rom a table in p
99e0: 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72  SrcList is refer
99f0: 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f  enced, then reco
9a00: 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63  rd.  ** this fac
9a10: 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73  t in the pSrcLis
9a20: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69  t.a[].colUsed bi
9a30: 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30  tmask.  Column 0
9a40: 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74   causes.  ** bit
9a50: 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43   0 to be set.  C
9a60: 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74  olumn 1 sets bit
9a70: 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74   1.  And so fort
9a80: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  h.  If the.  ** 
9a90: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73  column number is
9aa0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
9ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
9ac0: 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a   in the bitmask.
9ad0: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68    ** then set th
9ae0: 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74  e high-order bit
9af0: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e   of the bitmask.
9b00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
9b10: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
9b20: 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20   pMatch!=0 ){.  
9b30: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
9b40: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  >iColumn;.    if
9b50: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n>=sizeof(Bitm
9b60: 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20  ask)*8 ){.      
9b70: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  n = sizeof(Bitma
9b80: 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20  sk)*8-1;.    }. 
9b90: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
9ba0: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
9bb0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
9bc0: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
9bd0: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
9be0: 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70  <<n;.  }..lookup
9bf0: 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43  name_end:.  /* C
9c00: 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
9c10: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
9c20: 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20 73  3_free(zDb);.  s
9c30: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62  qlite3_free(zTab
9c40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
9c50: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c  Delete(pExpr->pL
9c60: 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  eft);.  pExpr->p
9c70: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Left = 0;.  sqli
9c80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
9c90: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9ca0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
9cb0: 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  0;.  pExpr->op =
9cc0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b   TK_COLUMN;.look
9cd0: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20  upname_end_2:.  
9ce0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
9cf0: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
9d00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9d10: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
9d20: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
9d30: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
9d40: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
9d50: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ist);.    if( pM
9d60: 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d  atch && !pMatch-
9d70: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
9d80: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
9d90: 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20  pMatch->pTab;.  
9da0: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65    }.    /* Incre
9db0: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61  ment the nRef va
9dc0: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20  lue on all name 
9dd0: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f  contexts from To
9de0: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a  pNC up to.    **
9df0: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65   the point where
9e00: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65   the name matche
9e10: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b  d. */.    for(;;
9e20: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9e30: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20   pTopNC!=0 );.  
9e40: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66      pTopNC->nRef
9e50: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
9e60: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61  opNC==pNC ) brea
9e70: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20  k;.      pTopNC 
9e80: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b  = pTopNC->pNext;
9e90: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
9ea0: 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 0;.  } else {.
9eb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9ec0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9ed0: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67  routine is desig
9ee0: 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20  ned as an xFunc 
9ef0: 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
9f00: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
9f10: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
9f20: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
9f30: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
9f40: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
9f50: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
9f60: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
9f70: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
9f80: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
9f90: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
9fa0: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
9fb0: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
9fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9fd0: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
9fe0: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
9ff0: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
a000: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
a010: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
a020: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
a030: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
a040: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
a050: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
a060: 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76  c int nameResolv
a070: 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72  erStep(void *pAr
a080: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
a090: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
a0a0: 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
a0b0: 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  xt*)pArg;.  Pars
a0c0: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  e *pParse;..  if
a0d0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
a0e0: 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28  urn 1;.  assert(
a0f0: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61   pNC!=0 );.  pPa
a100: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a110: 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  e;..  if( ExprHa
a120: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
a130: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
a140: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45   ) return 1;.  E
a150: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
a160: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
a170: 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  d);.#ifndef NDEB
a180: 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53  UG.  if( pNC->pS
a190: 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70  rcList && pNC->p
a1a0: 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e  SrcList->nAlloc>
a1b0: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
a1c0: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
a1d0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
a1e0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a1f0: 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c  =0; i<pNC->pSrcL
a200: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
a210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a220: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
a230: 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63  ursor>=0 && pSrc
a240: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
a250: 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29  or<pParse->nTab)
a260: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
a270: 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  if.  switch( pEx
a280: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
a290: 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   Double-quoted s
a2a0: 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63  trings (ex: "abc
a2b0: 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69  ") are used as i
a2c0: 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20  dentifiers if.  
a2d0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20    ** possible.  
a2e0: 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72  Otherwise they r
a2f0: 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73  emain as strings
a300: 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64  .  Single-quoted
a310: 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
a320: 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20  (ex: 'abc') are 
a330: 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69  always string li
a340: 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20  terals..    */. 
a350: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a360: 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G: {.      if( p
a370: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
a380: 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a  =='\'' ) break;.
a390: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
a3a0: 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49  ru into the TK_I
a3b0: 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69  D case if this i
a3c0: 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  s a double-quote
a3d0: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  d string */.    
a3e0: 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20  }.    /* A lone 
a3f0: 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68  identifier is th
a400: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
a410: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mn..    */.    c
a420: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
a430: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
a440: 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78  arse, 0, 0, &pEx
a450: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20  pr->token, pNC, 
a460: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
a470: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
a480: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
a490: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
a4a0: 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a  name:     ID.ID.
a4b0: 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61      ** Or a data
a4c0: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
a4d0: 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49  column:  ID.ID.I
a4e0: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  D.    */.    cas
a4f0: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
a500: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
a510: 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  ;.      Token *p
a520: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b  Table;.      Tok
a530: 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45  en *pDb;.      E
a540: 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20  xpr *pRight;..  
a550: 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c      /* if( pSrcL
a560: 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20  ist==0 ) break; 
a570: 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  */.      pRight 
a580: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
a590: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
a5a0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  t->op==TK_ID ){.
a5b0: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b          pDb = 0;
a5c0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
a5d0: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
a5e0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
a5f0: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
a600: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
a610: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
a620: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
a630: 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20  p==TK_DOT );.   
a640: 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70       pDb = &pExp
a650: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
a660: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
a670: 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74  = &pRight->pLeft
a680: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
a690: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
a6a0: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65  ht->pRight->toke
a6b0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
a6c0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
a6d0: 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c  se, pDb, pTable,
a6e0: 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70   pColumn, pNC, p
a6f0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
a700: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
a710: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e    /* Resolve fun
a720: 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20  ction names.    
a730: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
a740: 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
a750: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
a760: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
a770: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
a780: 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54  ->pList;    /* T
a790: 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  he argument list
a7a0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
a7b0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
a7c0: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20  >nExpr : 0;  /* 
a7d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
a7e0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
a7f0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
a800: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
a810: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
a820: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
a830: 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e       int wrong_n
a840: 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20  um_args = 0;    
a850: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e   /* True if wron
a860: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
a870: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
a880: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20  nt is_agg = 0;  
a890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a8a0: 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72  ue if is an aggr
a8b0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
a8c0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
a8d0: 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20       int auth;  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f   /* Authorizatio
a900: 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e  n to use the fun
a910: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a920: 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
a930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a940: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
a950: 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e  rs in function n
a960: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ame */.      con
a970: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
a980: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a990: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a  function name. *
a9a0: 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
a9b0: 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pDef;          
a9c0: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
a9d0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e  on about the fun
a9e0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
a9f0: 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  nt enc = ENC(pPa
aa00: 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68  rse->db);  /* Th
aa10: 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64  e database encod
aa20: 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49  ing */..      zI
aa30: 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  d = (char*)pExpr
aa40: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
aa50: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
aa60: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
aa70: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
aa80: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
aa90: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c  db, zId, nId, n,
aaa0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
aab0: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
aac0: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
aad0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
aae0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
aaf0: 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c  d, nId, -1, enc,
ab00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
ab10: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
ab20: 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75        no_such_fu
ab30: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
ab40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ab50: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
ab60: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
ab70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ab80: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65      is_agg = pDe
ab90: 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20  f->xFunc==0;.   
aba0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
abb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
abc0: 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  ZATION.      if(
abd0: 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20   pDef ){.       
abe0: 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41   auth = sqlite3A
abf0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
ac00: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
ac10: 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  , 0, pDef->zName
ac20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
ac30: 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f  ( auth!=SQLITE_O
ac40: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
ac50: 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f  f( auth==SQLITE_
ac60: 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20  DENY ){.        
ac70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ac80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
ac90: 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75   authorized to u
aca0: 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22  se function: %s"
acb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d        pDef->zNam
ace0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
acf0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
ad00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ad10: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
ad20: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  K_NULL;.        
ad30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ad40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
ad50: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69  ndif.      if( i
ad60: 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61  s_agg && !pNC->a
ad70: 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20  llowAgg ){.     
ad80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ad90: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
ada0: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  se of aggregate 
adb0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
adc0: 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20  , nId,zId);.    
add0: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
ade0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
adf0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
ae00: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
ae10: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
ae20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ae30: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  rse, "no such fu
ae40: 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e  nction: %.*s", n
ae50: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
ae60: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
ae70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77       }else if( w
ae80: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b  rong_num_args ){
ae90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aea0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
aeb0: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
aec0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
aed0: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a  nction %.*s()",.
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64               nId
aef0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
af00: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
af10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
af20: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20  s_agg ){.       
af30: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
af40: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20  AGG_FUNCTION;.  
af50: 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67        pNC->hasAg
af60: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
af70: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
af80: 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20  ) pNC->allowAgg 
af90: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
afa0: 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30  =0; pNC->nErr==0
afb0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
afc0: 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54         walkExprT
afd0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
afe0: 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c  pExpr, nameResol
aff0: 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20  verStep, pNC);. 
b000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b010: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61   is_agg ) pNC->a
b020: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20  llowAgg = 1;.   
b030: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43     /* FIX ME:  C
b040: 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66  ompute pExpr->af
b050: 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20  finity based on 
b060: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74  the expected ret
b070: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  urn.      ** typ
b080: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
b090: 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n .      */.    
b0a0: 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b    return is_agg;
b0b0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b0c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b0d0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
b0e0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
b0f0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
b100: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  if.    case TK_I
b110: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
b120: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
b130: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65  .        int nRe
b140: 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23  f = pNC->nRef;.#
b150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b160: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20  IT_CHECK.       
b170: 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63   if( pNC->isChec
b180: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  k ){.          s
b190: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b1a0: 50 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65  Parse,"subquerie
b1b0: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
b1c0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b1d0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  s");.        }.#
b1e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71  endif.        sq
b1f0: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
b200: 76 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ve(pParse, pExpr
b210: 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b  ->pSelect, pNC);
b220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b230: 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66   pNC->nRef>=nRef
b240: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b250: 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20  nRef!=pNC->nRef 
b260: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
b270: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
b280: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
b290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b2a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b2b0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
b2d0: 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  K.    case TK_VA
b2e0: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
b2f0: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
b300: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b310: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b320: 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70  se,"parameters p
b330: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
b340: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  CK constraints")
b350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b360: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b370: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
b380: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
b390: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
b3a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
b3b0: 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20  ee and resolves 
b3c0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a  references to.**
b3d0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20   table columns. 
b3e0: 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f   Nodes of the fo
b3f0: 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72  rm ID.ID or ID r
b400: 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a  esolve into an.*
b410: 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74  * index to the t
b420: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
b430: 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c  e list and a col
b440: 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65  umn offset.  The
b450: 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65   .** Expr.opcode
b460: 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20   for such nodes 
b470: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
b480: 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78  _COLUMN.  The Ex
b490: 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c  pr.iTable.** val
b4a0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
b4b0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
b4c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
b4d0: 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a  le in pTabList.*
b4e0: 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65  * plus the "base
b4f0: 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61  " value.  The ba
b500: 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c  se value will ul
b510: 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20  timately become 
b520: 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73  the.** VDBE curs
b530: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20  or number for a 
b540: 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
b550: 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65  ointing into the
b560: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74   referenced.** t
b570: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
b580: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73  iColumn value is
b590: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
b5a0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
b5b0: 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72  umn .** of the r
b5c0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e  eferenced table.
b5d0: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
b5e0: 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  mn value for the
b5f0: 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49   special.** ROWI
b600: 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20  D column is -1. 
b610: 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49   Any INTEGER PRI
b620: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
b630: 69 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a  is tried as an.*
b640: 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49  * alias for ROWI
b650: 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  D..**.** Also re
b660: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
b670: 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74  ames and check t
b680: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72  he functions for
b690: 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65   proper.** usage
b6a0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  .  Make sure all
b6b0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20   function names 
b6c0: 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  are recognized a
b6d0: 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73  nd all functions
b6e0: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72  .** have the cor
b6f0: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
b700: 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65  rguments.  Leave
b710: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b720: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e  e.** in pParse->
b730: 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68  zErrMsg if anyth
b740: 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52  ing is amiss.  R
b750: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b760: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
b770: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
b780: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
b790: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
b7a0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50   then set the EP
b7b0: 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79  _Agg.** property
b7c0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
b7d0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
b7e0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
b7f0: 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  es( .  NameConte
b800: 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f  xt *pNC,       /
b810: 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72  * Namespace to r
b820: 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f  esolve expressio
b830: 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72  ns in. */.  Expr
b840: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
b850: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b860: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
b870: 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yzed. */.){.  in
b880: 74 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 0a  t savedHasAgg;..
b890: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b8a0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53   return 0;.#if S
b8b0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
b8c0: 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 69  EPTH>0.  {.    i
b8d0: 6e 74 20 6d 78 44 65 70 74 68 20 3d 20 70 4e 43  nt mxDepth = pNC
b8e0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  ->pParse->db->aL
b8f0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
b900: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
b910: 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 6e     if( (pExpr->n
b920: 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72  Height+pNC->pPar
b930: 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 6d 78 44  se->nHeight)>mxD
b940: 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  epth ){.      sq
b950: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
b960: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
b970: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
b980: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
b990: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
b9a0: 68 20 25 64 29 22 2c 20 6d 78 44 65 70 74 68 0a  h %d)", mxDepth.
b9b0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
b9c0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b9d0: 20 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e     pNC->pParse->
b9e0: 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72  nHeight += pExpr
b9f0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a 23  ->nHeight;.  }.#
ba00: 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73  endif.  savedHas
ba10: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
ba20: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
ba30: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
ba40: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
ba50: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
ba60: 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  C);.#if SQLITE_M
ba70: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
ba80: 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e    pNC->pParse->n
ba90: 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d  Height -= pExpr-
baa0: 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66  >nHeight;.#endif
bab0: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72  .  if( pNC->nErr
bac0: 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  >0 ){.    ExprSe
bad0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
bae0: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a   EP_Error);.  }.
baf0: 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67    if( pNC->hasAg
bb00: 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  g ){.    ExprSet
bb10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
bb20: 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65  EP_Agg);.  }else
bb30: 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67   if( savedHasAgg
bb40: 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73   ){.    pNC->has
bb50: 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  Agg = 1;.  }.  r
bb60: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
bb70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
bb80: 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Error);.}../*.**
bb90: 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61   A pointer insta
bba0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
bbb0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
bbc0: 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
bbd0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c  n.** through wal
bbe0: 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63  kExprTree into c
bbf0: 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28  odeSubqueryStep(
bc00: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
bc10: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
bc20: 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75  QueryCoder;.stru
bc30: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a  ct QueryCoder {.
bc40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
bc50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
bc60: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bc70: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
bc80: 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73  pNC;    /* Names
bc90: 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e  pace of first en
bca0: 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f  closing query */
bcb0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
bcc0: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
bcd0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
bce0: 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  opt = 1;.#else. 
bcf0: 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33   #define sqlite3
bd00: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31  _enable_in_opt 1
bd10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
bd20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
bd30: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
bd40: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
bd50: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
bd60: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
bd70: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
bd80: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
bd90: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
bda0: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
bdb0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
bdc0: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
bdd0: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
bde0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
bdf0: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
be00: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
be10: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
be20: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
be30: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
be40: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
be50: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
be60: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
be70: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
be80: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
be90: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
bea0: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
beb0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
bec0: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
bed0: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
bee0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bef0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
bf00: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
bf10: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
bf20: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
bf30: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
bf40: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
bf50: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
bf60: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
bf70: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
bf80: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
bf90: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
bfa0: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
bfb0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bfd0: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
bfe0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
bff0: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
c000: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
c010: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
c020: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
c030: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
c040: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c050: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
c060: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
c070: 68 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  he mustBeUnique 
c080: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
c090: 73 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  se, the structur
c0a0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
c0b0: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
c0c0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
c0d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
c0e0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
c0f0: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
c100: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
c110: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
c120: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
c130: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
c140: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
c150: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
c160: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
c170: 0a 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65  .**.** If mustBe
c180: 55 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20  Unique is true, 
c190: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
c1a0: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
c1b0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
c1c0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
c1d0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
c1e0: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
c1f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
c200: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
c210: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
c220: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
c230: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
c240: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
c250: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
c260: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
c270: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
c280: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
c290: 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76  * is unique by v
c2a0: 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74  irtue of a const
c2b0: 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69  raint or implici
c2c0: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e  t index..*/.#ifn
c2d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c2e0: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
c2f0: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
c300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
c310: 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73  xpr *pX, int mus
c320: 74 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65  tBeUnique){.  Se
c330: 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65  lect *p;.  int e
c340: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
c350: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
c360: 54 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  Tab++;..  /* The
c370: 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e   follwing if(...
c380: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ) expression is 
c390: 74 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45  true if the SELE
c3a0: 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20  CT is of the .  
c3b0: 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a  ** simple form:.
c3c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
c3d0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
c3e0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a  OM <table>.  **.
c3f0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
c400: 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79  the case, it may
c410: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
c420: 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
c430: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e  table.  ** or in
c440: 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67  dex instead of g
c450: 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68  enerating an eph
c460: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20  eremal table..  
c470: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
c480: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a 20  _enable_in_opt. 
c490: 20 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65 6c    && (p=pX->pSel
c4a0: 65 63 74 29 21 3d 30 20 26 26 20 21 70 2d 3e 70  ect)!=0 && !p->p
c4b0: 50 72 69 6f 72 0a 20 20 20 26 26 20 21 70 2d 3e  Prior.   && !p->
c4c0: 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
c4d0: 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
c4e0: 47 72 6f 75 70 42 79 0a 20 20 20 26 26 20 70 2d  GroupBy.   && p-
c4f0: 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
c500: 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 21 70 2d  ->nSrc==1 && !p-
c510: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
c520: 65 63 74 0a 20 20 20 26 26 20 70 2d 3e 70 53 72  ect.   && p->pSr
c530: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 26 26 20  c->a[0].pTab && 
c540: 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  !p->pSrc->a[0].p
c550: 54 61 62 2d 3e 70 53 65 6c 65 63 74 0a 20 20 20  Tab->pSelect.   
c560: 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
c570: 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 70 45 4c  xpr==1 && p->pEL
c580: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
c590: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
c5a0: 20 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20    && !p->pLimit 
c5b0: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 26  && !p->pOffset &
c5c0: 26 20 21 70 2d 3e 70 57 68 65 72 65 0a 20 20 29  & !p->pWhere.  )
c5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
c5e0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c5f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
c600: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
c610: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
c620: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  0].pExpr;.    in
c630: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
c640: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64 62  iColumn;.    Vdb
c650: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
c660: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
c670: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
c680: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
c690: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
c6a0: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
c6b0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
c6c0: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
c6d0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
c6e0: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
c6f0: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
c700: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
c710: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
c720: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
c730: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
c740: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
c750: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
c760: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
c770: 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Addr;.      Tabl
c780: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
c790: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
c7a0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c7b0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c7c0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
c7d0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
c7e0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
c7f0: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
c800: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
c810: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c820: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
c830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c840: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c850: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20  er, 1, iMem);.. 
c860: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
c870: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
c880: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
c890: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
c8a0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
c8b0: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
c8c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c8d0: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
c8e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c8f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
c900: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
c910: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
c920: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
c930: 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  is to .      ** 
c940: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
c950: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
c960: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
c970: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
c980: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
c990: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c9a0: 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ce..      */.   
c9b0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
c9c0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
c9d0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
c9e0: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
c9f0: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
ca00: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
ca10: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
ca20: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
ca30: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
ca40: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
ca50: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
ca60: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
ca70: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
ca80: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
ca90: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
caa0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
cab0: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
cac0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
cad0: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
cae0: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [0].pTab;.      
caf0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
cb00: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58  risonAffinity(pX
cb10: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  );.      int aff
cb20: 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62  inity_ok = (pTab
cb30: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
cb40: 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d  inity==aff||aff=
cb50: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
cb60: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49  );..      for(pI
cb70: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
cb80: 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
cb90: 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  0 && affinity_ok
cba0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
cbb0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
cbc0: 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e   (pIdx->aiColumn
cbd0: 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20  [0]==iCol).     
cbe0: 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73 71      && (pReq==sq
cbf0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
cc00: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
cc10: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d  dx->azColl[0], -
cc20: 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  1, 0)).         
cc30: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
cc40: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
cc50: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
cc60: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
cc70: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
cc80: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
cc90: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
cca0: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
ccb0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
ccc0: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
ccd0: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
cce0: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
ccf0: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
cd00: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
cd10: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
cd20: 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
cd30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cd40: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
cd50: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
cd60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
cd70: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
cd80: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64  ..          iAdd
cd90: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
cda0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
cdb0: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  iMem);.         
cdc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cdd0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cde0: 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20  , 1, iMem);.  . 
cdf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ce00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ce10: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
ce20: 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  0, pIdx->nColumn
ce30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ce40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ce50: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
ce60: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
ce70: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
cea0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
ceb0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
cec0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
ced0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
cee0: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
cef0: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
cf00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cf10: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
cf20: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
cf30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cf40: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
cf50: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pe==0 ){.    sql
cf60: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
cf70: 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20  t(pParse, pX);. 
cf80: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
cf90: 44 45 58 5f 45 50 48 3b 0a 20 20 7d 65 6c 73 65  DEX_EPH;.  }else
cfa0: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
cfb0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
cfc0: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
cfd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
cfe0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
cff0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
d000: 20 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72   used as an expr
d010: 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e  ession.** and IN
d020: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
d030: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
d040: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d050: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
d060: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
d070: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
d080: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
d090: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
d0a0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
d0b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
d0c0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d0d0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
d0e0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
d0f0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
d100: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
d110: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d120: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d130: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
d140: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
d150: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
d160: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
d170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
d180: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
d190: 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  bquery..*/.#ifnd
d1a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d1b0: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
d1c0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
d1d0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
d1e0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
d1f0: 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20   int testAddr = 
d200: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
d220: 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
d230: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
d240: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d250: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d260: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a  ==0 ) return;...
d270: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
d280: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
d290: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
d2a0: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
d2b0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
d2c0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
d2d0: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
d2e0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
d2f0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
d300: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
d310: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
d320: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
d330: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
d340: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d350: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
d360: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
d370: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
d380: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
d390: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
d3a0: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
d3b0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
d3c0: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
d3d0: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
d3e0: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
d3f0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
d400: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
d410: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
d420: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
d430: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
d440: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
d450: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
d460: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
d470: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50    int mem = ++pP
d480: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
d490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4a0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29  1(v, OP_If, mem)
d4b0: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
d4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d4d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d4e0: 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61  , 1, mem);.    a
d4f0: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
d500: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
d510: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d520: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
d530: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
d540: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
d550: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
d560: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
d570: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
d580: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
d590: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d5a0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d5b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
d5c0: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
d5d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
d5e0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
d5f0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
d600: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
d610: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
d620: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
d630: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
d640: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
d650: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
d660: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76  he same way. A v
d670: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
d680: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
d690: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
d6a0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
d6b0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
d6c0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
d6d0: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
d6e0: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
d6f0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
d700: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
d710: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
d720: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
d730: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
d740: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
d750: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
d760: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
d770: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
d780: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
d790: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
d7a0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
d7b0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
d7c0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
d7d0: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
d7e0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
d7f0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
d800: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
d810: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
d820: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
d830: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
d840: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
d850: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
d860: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
d870: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
d880: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
d890: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
d8a0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
d8b0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
d8c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
d8d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
d8e0: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d910: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
d920: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
d930: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
d940: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
d950: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
d960: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
d970: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ..      if( pExp
d980: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
d990: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
d9a0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
d9b0: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
d9c0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
d9d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d9e0: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
d9f0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
da00: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
da10: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
da20: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
da30: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
da40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
da50: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
da60: 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  est;.        Exp
da70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
da80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
da90: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
daa0: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
dab0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
dac0: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e        dest.affin
dad0: 69 74 79 20 3d 20 28 69 6e 74 29 61 66 66 69 6e  ity = (int)affin
dae0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
daf0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
db00: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
db10: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
db20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
db30: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
db40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
db50: 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c  ct, &dest, 0, 0,
db60: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
db70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
db80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
db90: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
dba0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
dbb0: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
dbc0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
dbd0: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
dbe0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
dbf0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
dc00: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
dc10: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
dc20: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
dc30: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
dc40: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
dc50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
dc60: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
dc70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
dc80: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
dc90: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
dca0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
dcb0: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
dcc0: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
dcd0: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
dce0: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
dcf0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
dd00: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
dd10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
dd20: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
dd30: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
dd40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
dd50: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
dd60: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
dd70: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
dd80: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
dd90: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
dda0: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
ddb0: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
ddc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
ddd0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
dde0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
ddf0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
de00: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
de10: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
de20: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
de30: 32 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  2;..        if( 
de40: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
de50: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
de60: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
de70: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
de80: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
de90: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
dea0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
deb0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
dec0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
ded0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
dee0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
def0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
df00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
df10: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
df20: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
df30: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
df40: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
df50: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
df60: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
df70: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
df80: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
df90: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
dfa0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
dfb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
dfc0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
dfd0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
dfe0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
dff0: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
e000: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
e010: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
e020: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
e030: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
e040: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
e050: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
e060: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
e070: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
e080: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
e090: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
e0a0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
e0b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e0c0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
e0d0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
e0e0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
e0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
e100: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e110: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
e120: 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  dr-1, 2);.      
e130: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
e140: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
e150: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
e160: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
e170: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
e180: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
e190: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
e1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e1b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
e1c0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
e1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e1e0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
e1f0: 6f 72 64 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20  ord, r1, 1, r2, 
e200: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
e210: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e230: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
e240: 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a  r->iTable, r2);.
e250: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e260: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
e270: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
e280: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
e290: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
e2a0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
e2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
e2c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e2d0: 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
e2e0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)&keyInfo, P4_
e2f0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
e300: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e310: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
e320: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
e330: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
e340: 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
e350: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e  a scalar SELECT.
e360: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
e370: 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20  to put the.     
e380: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69   ** value of thi
e390: 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65  s select in a me
e3a0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
e3b0: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a  cord the number.
e3c0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
e3d0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
e3e0: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
e3f0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e400: 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20  nst Token one = 
e410: 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31  { (u8*)"1", 0, 1
e420: 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   };.      Select
e430: 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 53 65   *pSel;.      Se
e440: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a  lectDest dest;..
e450: 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
e460: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
e470: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
e480: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
e490: 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  0, ++pParse->nMe
e4a0: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  m);.      if( pE
e4b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
e4c0: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65  CT ){.        de
e4d0: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d  st.eDest = SRT_M
e4e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  em;.        sqli
e4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e500: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
e510: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
e520: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e530: 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
e540: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
e550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e560: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
e570: 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20  T_Exists;.      
e580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e590: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e5a0: 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61 72 6d  r, 0, dest.iParm
e5b0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
e5c0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
e5d0: 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
e5e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e5f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
e600: 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  te(pSel->pLimit)
e610: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
e620: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45  imit = sqlite3PE
e630: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
e640: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f  NTEGER, 0, 0, &o
e650: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ne);.      if( s
e660: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e670: 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
e680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b  , 0, 0, 0, 0) ){
e690: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
e6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e6b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
e6c0: 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20  dest.iParm;.    
e6d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e6e0: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
e6f0: 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  dr ){.    sqlite
e700: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e710: 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20   testAddr-1);.  
e720: 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  }..  return;.}.#
e730: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e740: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
e750: 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
e760: 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
e770: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
e780: 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
e790: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
e7a0: 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
e7b0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
e7c0: 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
e7d0: 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
e7e0: 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
e7f0: 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
e800: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
e810: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ut;.}../*.** Gen
e820: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
e830: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
e840: 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20  ut the floating 
e850: 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64  point.** value d
e860: 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e  escribed by z[0.
e870: 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73  .n-1] into regis
e880: 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ter iMem..**.** 
e890: 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77  The z[] string w
e8a0: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74  ill probably not
e8b0: 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61   be zero-termina
e8c0: 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a  ted.  But the .*
e8d0: 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72  * z[n] character
e8e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
e8f0: 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74  o be something t
e900: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  hat does not loo
e910: 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f  k.** like the co
e920: 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68  ntinuation of th
e930: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
e940: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61  tic void codeRea
e950: 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  l(Vdbe *v, const
e960: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
e970: 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c   int negateFlag,
e980: 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 61 73   int iMem){.  as
e990: 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20  sert( z || v==0 
e9a0: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 44 62  || sqlite3VdbeDb
e9b0: 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (v)->mallocFaile
e9c0: 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a  d );.  if( z ){.
e9d0: 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
e9e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a  ;.    char *zV;.
e9f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 64      assert( !isd
ea00: 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20  igit(z[n]) );.  
ea10: 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
ea20: 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
ea30: 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
ea40: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
ea50: 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
ea60: 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
ea70: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
ea80: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ea90: 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20  _Real, 0, iMem, 
eaa0: 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b  0, zV, P4_REAL);
eab0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
eac0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
ead0: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
eae0: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
eaf0: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
eb00: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69  text z[0..n-1] i
eb10: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65  nto register iMe
eb20: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d  m..**.** The z[]
eb30: 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f   string will pro
eb40: 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72  bably not be zer
eb50: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42  o-terminated.  B
eb60: 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20  ut the .** z[n] 
eb70: 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61  character is gua
eb80: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f  ranteed to be so
eb90: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65  mething that doe
eba0: 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69  s not look.** li
ebb0: 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74  ke the continuat
ebc0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ion of the numbe
ebd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
ebe0: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
ebf0: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
ec00: 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  r *z, int n, int
ec10: 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d   negFlag, int iM
ec20: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a  em){.  assert( z
ec30: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
ec40: 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61  te3VdbeDb(v)->ma
ec50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ec60: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 69 6e 74  if( z ){.    int
ec70: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
ec80: 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29  !isdigit(z[n]) )
ec90: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
eca0: 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29  3GetInt32(z, &i)
ecb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
ecc0: 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a  gFlag ) i = -i;.
ecd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ece0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
ecf0: 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b  teger, i, iMem);
ed00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ed10: 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69  qlite3FitsIn64Bi
ed20: 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29 20 29  ts(z, negFlag) )
ed30: 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61 6c 75  {.      i64 valu
ed40: 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e;.      char *z
ed50: 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  V;.      sqlite3
ed60: 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65  Atoi64(z, &value
ed70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  );.      if( neg
ed80: 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
ed90: 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 56 20  value;.      zV 
eda0: 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
edb0: 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
edc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
edd0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74  AddOp4(v, OP_Int
ede0: 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  64, 0, iMem, 0, 
edf0: 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20  zV, P4_INT64);. 
ee00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee10: 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e  codeReal(v, z, n
ee20: 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29  , negFlag, iMem)
ee30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
ee40: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ee50: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
ee60: 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
ee70: 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
ee80: 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
ee90: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
eea0: 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
eeb0: 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 20 54  ister iReg..** T
eec0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
eed0: 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
eee0: 6e 20 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 49  n .** iTable.  I
eef0: 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
ef00: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
ef10: 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
ef20: 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76   the rowid..*/.v
ef30: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
ef40: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
ef50: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
ef60: 20 2f 2a 20 54 68 65 20 56 4d 20 62 65 69 6e 67   /* The VM being
ef70: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 54 61   created */.  Ta
ef80: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
ef90: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
efa0: 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
efb0: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a  e reading from *
efc0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c  /.  int iColumn,
efd0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
efe0: 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
eff0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  n */.  int iTabl
f000: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  e,      /* The c
f010: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
f020: 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  o the table */. 
f030: 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
f040: 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
f050: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
f060: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  if( iColumn<0 ){
f070: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70  .    int op = (p
f080: 54 61 62 20 26 26 20 49 73 56 69 72 74 75 61 6c  Tab && IsVirtual
f090: 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f  (pTab)) ? OP_VRo
f0a0: 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a  wid : OP_Rowid;.
f0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f0c0: 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 69 54 61  ddOp2(v, op, iTa
f0d0: 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65  ble, iReg);.  }e
f0e0: 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20  lse if( pTab==0 
f0f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f100: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
f110: 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69  olumn, iTable, i
f120: 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
f130: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f140: 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
f150: 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
f160: 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
f170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f180: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
f190: 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
f1a0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  g);.    sqlite3C
f1b0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
f1c0: 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  pTab, iColumn);.
f1d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f1e0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
f1f0: 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  NT.    if( pTab-
f200: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
f210: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
f220: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
f230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f240: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  Op1(v, OP_RealAf
f250: 66 69 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20  finity, iReg);. 
f260: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f270: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f280: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
f290: 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
f2a0: 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
f2b0: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
f2c0: 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
f2d0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
f2e0: 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
f2f0: 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
f300: 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
f310: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
f320: 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
f330: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
f340: 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
f350: 61 6e 74 65 65 64 20 74 68 61 74 20 72 65 73 75  anteed that resu
f360: 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
f370: 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
f380: 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
f390: 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
f3a0: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
f3b0: 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
f3c0: 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
f3d0: 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
f3e0: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
f3f0: 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
f400: 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
f410: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
f420: 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
f430: 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  register..*/.sta
f440: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 45  tic int sqlite3E
f450: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 50 61  xprCodeTarget(Pa
f460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
f470: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
f480: 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
f490: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f4a0: 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64  ;  /* The VM und
f4b0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
f4c0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f4e0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69  * The opcode bei
f4f0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
f500: 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74  t inReg = target
f510: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
f520: 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ts stored in reg
f530: 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20  ister inReg */. 
f540: 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
f550: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
f560: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
f570: 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
f580: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
f590: 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20  regFree2 = 0;   
f5a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
f5b0: 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
f5c0: 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
f5d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72  r */.  int r1, r
f5e0: 32 2c 20 72 33 3b 20 20 20 20 20 20 20 20 20 20  2, r3;          
f5f0: 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69   /* Various regi
f600: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  ster numbers */.
f610: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
f620: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
f630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
f640: 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
f650: 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
f660: 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
f670: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f680: 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   0;..  if( pExpr
f690: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
f6a0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
f6b0: 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
f6c0: 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
f6d0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
f6e0: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
f6f0: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
f700: 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
f710: 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
f720: 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
f730: 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
f740: 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
f750: 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
f760: 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
f770: 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
f780: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f790: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
f7a0: 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
f7b0: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
f7c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f7d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
f7e0: 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
f7f0: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
f800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f810: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
f820: 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
f830: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
f860: 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
f870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f890: 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
f8a0: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
f8b0: 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
f8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f8d0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
f8e0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
f8f0: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
f900: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
f910: 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69  appens when codi
f920: 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  ng check constra
f930: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ints */.        
f940: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
f950: 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20 20 20  ckBase>0 );.    
f960: 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
f970: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61  r->iColumn + pPa
f980: 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20  rse->ckBase;.   
f990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f9b0: 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45  eGetColumn(v, pE
f9c0: 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
f9f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78 70  r->iColumn, pExp
fa00: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
fa10: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
fa20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fa30: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
fa40: 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
fa50: 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61 72  Integer(v, (char
fa60: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
fa70: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
fa80: 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
fa90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
faa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
fab0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  AT: {.      code
fac0: 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
fad0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
fae0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
faf0: 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
fb00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fb10: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
fb20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
fb30: 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50 61  3DequoteExpr(pPa
fb40: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
fb50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb60: 62 65 41 64 64 4f 70 34 28 76 2c 4f 50 5f 53 74  beAddOp4(v,OP_St
fb70: 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
fb80: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
fba0: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fbb0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
fbc0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
fbd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fbe0: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
fbf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc00: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
fc10: 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
fc20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
fc30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc40: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
fc50: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
fc60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
fc70: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
fc80: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
fc90: 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
fca0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
fcb0: 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20 20  ken.n>=3 );.    
fcc0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
fcd0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78 27  >token.z[0]=='x'
fce0: 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   || pExpr->token
fcf0: 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  .z[0]=='X' );.  
fd00: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
fd10: 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27  r->token.z[1]=='
fd20: 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  \'' );.      ass
fd30: 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ert( pExpr->toke
fd40: 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n.z[pExpr->token
fd50: 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  .n-1]=='\'' );. 
fd60: 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e       n = pExpr->
fd70: 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20  token.n - 3;.   
fd80: 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45     z = (char*)pE
fd90: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32  xpr->token.z + 2
fda0: 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
fdb0: 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
fdc0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
fdd0: 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
fde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fdf0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
fe00: 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
fe10: 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
fe20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fe30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
fe40: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
fe50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
fe60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fe70: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
fe80: 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65  r->iTable, targe
fe90: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
fea0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29  xpr->token.n>1 )
feb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fec0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
fed0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78 70   -1, (char*)pExp
fee0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
fef0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
ff00: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ff10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ff20: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
ff30: 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
ff40: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
ff50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ff60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ff70: 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
ff80: 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
ff90: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ffa0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
ffb0: 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
ffc0: 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
ffd0: 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
ffe0: 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
fff0: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
10000 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
10010 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
10020 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
10030 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
10040 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29  e(&pExpr->token)
10050 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
10060 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
10070 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
10080 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
10090 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
100a0 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
100b0 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
100c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
100d0 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
100e0 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
100f0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
10100 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10110 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
10120 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
10130 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
10140 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10150 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
10160 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
10170 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
10180 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10190 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
101a0 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
101b0 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
101c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
101d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 74 6f  VdbeAddOp1(v, to
101e0 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20  _op, inReg);.   
101f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10200 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10210 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
10220 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
10230 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
10240 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
10250 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
10260 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
10270 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
10280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10290 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
102a0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
102b0 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
102c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
102d0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
102e0 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
102f0 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
10300 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
10310 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
10320 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
10330 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
10340 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
10350 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
10360 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
10370 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
10380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10390 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
103a0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
103b0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
103c0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
103d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
103e0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
103f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10400 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
10410 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
10420 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
10430 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10440 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
10450 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
10460 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
10470 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
10480 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
10490 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
104a0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
104b0 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
104c0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
104d0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
104e0 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
104f0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
10500 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
10510 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
10520 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
10530 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
10540 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
10550 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
10560 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
10570 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
10580 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
10590 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
105a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
105b0 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
105c0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
105d0 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
105e0 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
105f0 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
10600 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
10610 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
10620 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
10630 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10640 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
10650 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
10660 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
10670 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
10680 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
10690 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
106a0 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
106b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
106c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
106d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
106e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
106f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
10700 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
10710 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
10720 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
10730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10740 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
10750 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a  2, r1, target);.
10760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10770 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
10780 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
10790 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
107a0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
107b0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
107c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
107d0 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
107e0 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
107f0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
10800 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
10810 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
10820 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
10830 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
10840 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 52  .          codeR
10850 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 2d  eal(v, (char*)p-
10860 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61 72  >z, p->n, 1, tar
10870 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
10880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
10890 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63  odeInteger(v, (c
108a0 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c  har*)p->z, p->n,
108b0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
108c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
108d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67 46  se{.        regF
108e0 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c 69  ree1 = r1 = sqli
108f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
10900 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
10910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10920 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10930 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  0, r1);.        
10940 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
10950 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10960 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10970 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
10980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10990 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
109a0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
109b0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
109c0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
109d0 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
109e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
109f0 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
10a00 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
10a10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
10a20 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
10a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10a40 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
10a50 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
10a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10a70 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
10a80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
10a90 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
10aa0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10ab0 20 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   op, inReg);.   
10ac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10ad0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
10ae0 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
10af0 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
10b00 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
10b10 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
10b20 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
10b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10b40 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
10b50 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
10b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10b70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10b80 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
10b90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
10ba0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
10bb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10bc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
10bd0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10be0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
10bf0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  p, r1);.      sq
10c00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10c10 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
10c20 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10c40 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
10c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
10c70 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
10c80 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
10c90 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
10ca0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
10cb0 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
10cc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10cd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
10ce0 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
10cf0 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
10d00 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
10d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10d20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
10d30 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
10d40 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20  r->iAgg].iMem;. 
10d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10d60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10d70 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
10d80 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
10d90 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
10da0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
10db0 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
10dc0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
10dd0 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
10de0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
10df0 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
10e00 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a  .      int nId;.
10e10 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10e20 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74   *zId;.      int
10e30 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a   constMask = 0;.
10e40 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
10e50 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
10e60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
10e70 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
10e80 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  db);.      CollS
10e90 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a  eq *pColl = 0;..
10ea0 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61        zId = (cha
10eb0 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
10ec0 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70  z;.      nId = p
10ed0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
10ee0 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
10ef0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
10f00 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
10f10 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63   nId, nExpr, enc
10f20 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
10f30 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20  rt( pDef!=0 );. 
10f40 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29       if( pList )
10f50 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20  {.        nExpr 
10f60 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
10f70 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
10f80 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
10f90 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72 29 3b  (pParse, nExpr);
10fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10fb0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
10fc0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
10fd0 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
10fe0 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 70 72 20  {.        nExpr 
10ff0 3d 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  = r1 = 0;.      
11000 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11010 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11020 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
11030 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
11040 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
11050 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
11060 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
11070 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
11080 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
11090 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
110a0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
110b0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
110c0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
110d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
110e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
110f0 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
11100 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
11110 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
11120 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
11130 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
11140 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
11150 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
11160 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
11170 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
11180 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
11190 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
111a0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
111b0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
111c0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
111d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
111e0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
111f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
11200 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
11210 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
11220 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
11230 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
11240 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
11250 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
11260 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
11270 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
11280 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
11290 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
112a0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
112b0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
112c0 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
112d0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
112e0 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
11300 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
11310 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
11320 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
11330 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
11340 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
11350 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20  if( nExpr>0 ){. 
11360 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
11370 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
11380 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
11390 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
113a0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
113b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
113c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
113d0 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
113e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
113f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
11400 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
11410 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
11420 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
11430 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
11440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
11450 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
11460 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  eq && !pColl ){.
11470 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
11480 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
11490 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
114a0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
114b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
114c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
114d0 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
114e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
114f0 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
11500 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
11510 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
11520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11530 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
11540 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
11550 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
11560 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
11570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11580 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
11590 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
115a0 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
115d0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
115e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
115f0 68 61 6e 67 65 50 35 28 76 2c 20 6e 45 78 70 72  hangeP5(v, nExpr
11600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  );.      if( nEx
11610 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
11620 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11630 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
11640 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , nExpr);.      
11650 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11660 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11670 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11680 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
11690 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
116a0 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
116b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
116c0 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
116d0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
116e0 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
116f0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
11700 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
11710 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
11720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11730 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
11740 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c   {.      int j1,
11750 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b   j2, j3, j4, j5;
11760 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
11770 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nity;.      int 
11780 65 54 79 70 65 3b 0a 0a 20 20 20 20 20 20 65 54  eType;..      eT
11790 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
117a0 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
117b0 20 70 45 78 70 72 2c 20 30 29 3b 0a 0a 20 20 20   pExpr, 0);..   
117c0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
117d0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
117e0 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
117f0 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
11800 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
11810 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11820 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
11830 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
11840 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
11850 72 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66  r.      ** P4 of
11860 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
11870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11880 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
11890 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
118a0 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  pr);..      sqli
118b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
118c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
118d0 74 61 72 67 65 74 29 3b 0a 0a 20 20 20 20 20 20  target);..      
118e0 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
118f0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
11900 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
11910 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
11920 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
11930 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
11940 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
11950 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
11960 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
11970 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
11980 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
11990 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
119a0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
119b0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
119c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
119d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b  OP_NotNull, r1);
119e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
119f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
11a00 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
11a10 0a 20 20 20 20 20 20 6a 32 20 20 3d 20 73 71 6c  .      j2  = sql
11a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
11a30 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
11a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11a50 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
11a60 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
11a70 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
11a80 0a 20 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71  .        j3 = sq
11a90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11aa0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
11ab0 20 72 31 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20   r1, 0, 1);.    
11ac0 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65 33      j4 = sqlite3
11ad0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11ae0 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70  _NotExists, pExp
11af0 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
11b00 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d 20  );.        j5 = 
11b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b20 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
11b30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11b40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33  beJumpHere(v, j3
11b50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11b60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11b70 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , j4);.      }el
11b80 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  se{.        r2 =
11b90 20 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c 69   regFree2 = sqli
11ba0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11bb0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
11bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11bd0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11be0 64 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61  d, r1, 1, r2, &a
11bf0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
11c00 20 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65       j5 = sqlite
11c10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11c20 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
11c30 69 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a  iTable, 0, r2);.
11c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11c60 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
11c70 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20  rget, -1);.     
11c80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11c90 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Here(v, j2);.   
11ca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11cb0 6d 70 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20  mpHere(v, j5);. 
11cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11cd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a  }.#endif.    /*.
11ce0 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
11cf0 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
11d00 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
11d10 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
11d20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
11d30 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
11d40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
11d50 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
11d60 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
11d70 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
11d80 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
11d90 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
11da0 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
11db0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
11dc0 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
11dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
11de0 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
11df0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
11e00 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
11e10 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11e20 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
11e30 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a  Expr->pList->a;.
11e40 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
11e50 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
11e60 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
11e70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
11e80 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
11e90 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
11ea0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
11eb0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
11ec0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
11ed0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
11ee0 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
11ef0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11f00 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11f10 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11f20 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 0a   pRight, OP_Ge,.
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53 51    r1, r2, r3, SQ
11f50 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
11f60 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
11f70 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
11f80 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
11f90 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
11fa0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11fb0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20   regFree2);.    
11fc0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
11fd0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
11fe0 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
11ff0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
12000 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
12010 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
12020 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72  OP_Le, r1, r2, r
12030 32 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  2, SQLITE_STOREP
12040 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
12050 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12060 50 5f 41 6e 64 2c 20 72 33 2c 20 72 32 2c 20 74  P_And, r3, r2, t
12070 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
12080 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12090 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
120a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
120b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
120c0 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
120d0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
120e0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
120f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
12100 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
12110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
12120 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f      /*.    ** Fo
12130 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm A:.    **   C
12140 41 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48  ASE x WHEN e1 TH
12150 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
12160 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
12170 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
12180 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
12190 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a  ** Form B:.    *
121a0 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31  *   CASE WHEN e1
121b0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
121c0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
121d0 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
121e0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
121f0 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20     ** Form A is 
12200 63 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d  can be transform
12210 65 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69  ed into the equi
12220 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73  valent form B as
12230 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
12240 20 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65     CASE WHEN x=e
12250 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
12260 3d 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a  =e2 THEN r2 ....
12270 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48      **        WH
12280 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20  EN x=eN THEN rN 
12290 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
122a0 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69  *.    ** X (if i
122b0 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20  t exists) is in 
122c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20  pExpr->pLeft..  
122d0 20 20 2a 2a 20 59 20 69 73 20 69 6e 20 70 45 78    ** Y is in pEx
122e0 70 72 2d 3e 70 52 69 67 68 74 2e 20 20 54 68 65  pr->pRight.  The
122f0 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74 69 6f   Y is also optio
12300 6e 61 6c 2e 20 20 49 66 20 74 68 65 72 65 20 69  nal.  If there i
12310 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45 4c 53 45  s no.    ** ELSE
12320 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 20 6f   clause and no o
12330 74 68 65 72 20 74 65 72 6d 20 6d 61 74 63 68 65  ther term matche
12340 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  s, then the resu
12350 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  lt of the.    **
12360 20 65 78 70 72 73 73 69 6f 6e 20 69 73 20 4e 55   exprssion is NU
12370 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
12380 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
12390 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
123a0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
123b0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
123c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
123d0 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
123e0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
123f0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
12400 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
12410 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
12420 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
12430 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
12440 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
12450 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
12460 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
12470 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
12480 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ASE: {.      int
12490 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20 20   endLabel;      
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124b0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
124c0 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74 6d   end of CASE stm
124d0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
124e0 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20 20  extCase;        
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12500 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20 6e  GOTO label for n
12510 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65 20  ext WHEN clause 
12520 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  */.      int nEx
12530 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
12540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 78             /* 2x
12550 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e 20   number of WHEN 
12560 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69  terms */.      i
12570 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
125a0 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
125b0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
125c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
125d0 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72 6d  ist of WHEN term
125e0 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  s */.      struc
125f0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
12600 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a 20  *aListelem;  /* 
12610 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74 65  Array of WHEN te
12620 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  rms */.      Exp
12630 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20 20  r opCompare;    
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12650 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70 72  * The X==Ei expr
12660 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
12670 45 78 70 72 20 63 61 63 68 65 58 3b 20 20 20 20  Expr cacheX;    
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 20 20 2f 2a 20 43 61 63 68 65 64 20 65 78 70 72    /* Cached expr
126a0 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20 20 20 20  ession X */.    
126b0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126d0 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
126e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
126f0 20 45 78 70 72 20 2a 70 54 65 73 74 3b 20 20 20   Expr *pTest;   
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
12720 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
12730 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a 20 20 20  (form B) */..   
12740 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
12750 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
12760 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
12770 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
12780 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
12790 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
127a0 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
127b0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
127c0 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
127d0 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
127e0 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
127f0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
12800 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
12810 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
12820 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
12830 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
12840 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
12850 29 7b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  ){.        cache
12860 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
12870 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20 3d   cacheX.iTable =
12880 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12890 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
128a0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
128b0 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70 20 3d       cacheX.op =
128c0 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
128d0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
128e0 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
128f0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
12900 65 66 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20  eft = &cacheX;. 
12910 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
12920 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
12930 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
12940 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32  ; i<nExpr; i=i+2
12950 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12960 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  X ){.          o
12970 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
12980 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
12990 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
129a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
129b0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
129c0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
129d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
129e0 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
129f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12a00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a10 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
12a20 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74 43  se, pTest, nextC
12a30 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ase, SQLITE_JUMP
12a40 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
12a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12a60 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
12a70 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
12a80 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
12a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12aa0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12ab0 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
12ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
12ad0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
12ae0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
12af0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
12b00 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
12b10 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12b20 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12b30 70 72 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67  pr->pRight, targ
12b40 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  et);.      }else
12b50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12b70 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
12b80 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
12b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12ba0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
12bb0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
12bc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
12bd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
12be0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
12bf0 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
12c00 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
12c10 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
12c20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12c30 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
12c60 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
12c70 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
12c80 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
12c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
12ca0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
12cb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f  pr->iColumn!=OE_
12cc0 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
12cd0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12ce0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f  ->iColumn==OE_Ro
12cf0 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20  llback ||.      
12d00 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
12d10 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
12d20 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20  Abort ||.       
12d30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
12d40 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46  >iColumn == OE_F
12d50 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ail );.         
12d60 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
12d70 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  pr(pParse->db, p
12d80 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
12d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12da0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
12db0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12dc0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
12dd0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12de0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
12df0 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
12e00 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
12e10 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n);.      } else
12e20 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
12e30 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
12e40 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
12e50 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
12e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e70 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20   OP_ContextPop, 
12e80 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
12e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ea0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12eb0 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
12ec0 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b  ck->ignoreJump);
12ed0 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  .         VdbeCo
12ee0 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61 69 73 65  mment((v, "raise
12ef0 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
12f00 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12f10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12f20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
12f30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12f40 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
12f50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
12f60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
12f70 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
12f80 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
12f90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12fa0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
12fb0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
12fc0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
12fd0 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
12fe0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
12ff0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
13000 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
13010 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
13020 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
13030 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
13040 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
13050 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
13060 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
13070 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
13080 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
13090 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
130a0 73 74 65 72 20 69 73 20 6e 6f 0a 2a 2a 20 61 20  ster is no.** a 
130b0 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
130c0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
130d0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
130e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 50 61  3ExprCodeTemp(Pa
130f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
13100 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
13110 52 65 67 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  Reg){.  int r1 =
13120 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13130 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  eg(pParse);.  in
13140 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78  t r2 = sqlite3Ex
13150 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
13160 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
13170 0a 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b  .  if( r2==r1 ){
13180 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b  .    *pReg = r1;
13190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
131a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
131b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
131c0 0a 20 20 20 20 2a 70 52 65 67 20 3d 20 30 3b 0a  .    *pReg = 0;.
131d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
131e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
131f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
13200 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
13210 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
13220 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
13230 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
13240 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
13250 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
13260 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
13270 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
13280 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rget..*/.int sql
13290 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
132a0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
132b0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
132c0 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
132d0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
132e0 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
132f0 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
13300 3b 0a 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  ;.  inReg = sqli
13310 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
13320 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
13330 20 74 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65   target);.  asse
13340 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  rt( pParse->pVdb
13350 65 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  e || pParse->db-
13360 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13370 0a 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61  .  if( inReg!=ta
13380 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
13390 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
133a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
133b0 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
133c0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
133d0 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20 20 72 65  arget);.  }.  re
133e0 74 75 72 6e 20 74 61 72 67 65 74 3b 0a 7d 0a 0a  turn target;.}..
133f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13400 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
13410 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
13420 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
13430 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
13440 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
13450 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
13460 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
13470 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
13480 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
13490 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
134a0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
134b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
134c0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
134d0 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
134e0 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
134f0 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
13500 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
13510 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
13520 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
13530 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
13540 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
13550 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
13560 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
13570 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
13580 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
13590 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
135a0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 69 6e  re reused..*/.in
135b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
135c0 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20  eAndCache(Parse 
135d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
135e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
135f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
13600 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
13610 69 6e 74 20 69 6e 52 65 67 3b 0a 20 20 69 6e 52  int inReg;.  inR
13620 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
13630 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
13640 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 61  pr, target);.  a
13650 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
13660 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
13670 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
13680 29 7b 20 20 0a 20 20 20 20 69 6e 74 20 69 4d 65  ){  .    int iMe
13690 6d 3b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 2b 2b  m;.    iMem = ++
136a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
136b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
136c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
136d0 69 6e 52 65 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  inReg, iMem);.  
136e0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
136f0 3d 20 69 4d 65 6d 3b 0a 20 20 20 20 70 45 78 70  = iMem;.    pExp
13700 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
13710 54 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TER;.  }.  retur
13720 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 0a 2f 2a 0a  n inReg;.}.../*.
13730 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13740 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
13750 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
13760 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
13770 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
13780 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73  on list into a s
13790 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
137a0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ters beginning a
137b0 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  t target..**.** 
137c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
137d0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76  r of elements ev
137e0 61 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  aluated..*/.int 
137f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
13800 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
13810 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
13820 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
13830 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13840 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
13850 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
13860 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13870 20 69 6e 74 20 74 61 72 67 65 74 20 20 20 20 20   int target     
13880 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13890 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
138a0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
138b0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
138c0 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
138d0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
138e0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
138f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13900 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13920 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
13930 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 6e 20 3d  arget>0 );.  n =
13940 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
13950 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
13960 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69  ->a, i=n; i>0; i
13970 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
13980 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13990 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  e(pParse, pItem-
139a0 3e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  >pExpr, target);
139b0 0a 20 20 20 20 74 61 72 67 65 74 2b 2b 3b 0a 20  .    target++;. 
139c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
139d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
139e0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
139f0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
13a00 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
13a10 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
13a20 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
13a30 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
13a40 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
13a50 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
13a60 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
13a70 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
13a80 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
13a90 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
13aa0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
13ab0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
13ac0 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
13ad0 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
13ae0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
13af0 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
13b00 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
13b10 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
13b20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
13b30 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
13b40 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
13b50 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
13b60 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
13b70 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
13b80 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
13b90 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
13ba0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
13bb0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
13bc0 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
13bd0 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
13be0 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
13bf0 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
13c00 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
13c10 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
13c20 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
13c30 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
13c40 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
13c50 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
13c60 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
13c70 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
13c80 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
13c90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13ca0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
13cb0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
13cc0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
13cd0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13ce0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
13cf0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
13d00 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
13d10 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
13d20 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
13d30 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
13d40 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
13d50 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
13d60 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   );.  if( v==0 |
13d70 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
13d80 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  urn;.  op = pExp
13d90 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
13da0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
13db0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
13dc0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
13dd0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
13de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
13df0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
13e00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
13e10 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53   d2,jumpIfNull^S
13e20 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
13e30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13e40 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
13e50 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
13e60 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
13e70 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
13e80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13e90 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
13ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13eb0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
13ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13ed0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
13ee0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
13ef0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
13f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13f10 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
13f20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
13f30 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
13f40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13f50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
13f60 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
13f70 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
13f80 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
13f90 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
13fa0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
13fb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13fc0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
13fd0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
13fe0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
13ff0 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
14000 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
14010 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
14020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
14030 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
14040 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
14050 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
14060 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
14070 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
14080 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
14090 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
140a0 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
140b0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
140c0 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
140d0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
140e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
140f0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
14100 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
14110 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
14120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
14130 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
14140 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
14150 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
14160 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
14170 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
14180 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
14190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
141a0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
141b0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
141c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
141d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
141e0 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
141f0 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
14200 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
14210 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
14220 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14230 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
14240 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
14250 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
14260 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14270 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
14280 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
14290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142a0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
142b0 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
142c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
142d0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
142e0 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42 45        /*    x BE
142f0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
14300 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14310 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  Is equivalent to
14320 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
14330 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
14340 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  x<=z.      **.  
14350 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20 61      ** Code it a
14360 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
14370 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
14380 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
14390 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  on.      ** elem
143a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 20  entation of x.. 
143b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
143c0 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20 20  pr exprAnd;.    
143d0 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b    Expr compLeft;
143e0 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70  .      Expr comp
143f0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78 70  Right;.      Exp
14400 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20 20  r exprX;..      
14410 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
14420 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70  pLeft;.      exp
14430 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  rAnd.op = TK_AND
14440 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64 2e  ;.      exprAnd.
14450 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
14460 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  t;.      exprAnd
14470 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
14480 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d 70  ight;.      comp
14490 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
144a0 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
144b0 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
144c0 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 70        compLeft.p
144d0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
144e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
144f0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68  ;.      compRigh
14500 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
14510 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c      compRight.pL
14520 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
14530 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52      compRight.pR
14540 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
14550 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
14560 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54 61  .      exprX.iTa
14570 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ble = sqlite3Exp
14580 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
14590 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
145a0 65 65 31 29 3b 0a 20 20 20 20 20 20 65 78 70 72  ee1);.      expr
145b0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
145c0 45 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ER;.      sqlite
145d0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
145e0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
145f0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
14600 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14610 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
14620 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
14630 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
14640 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
14650 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
14660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14670 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
14680 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
14690 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 62  ull!=0);.      b
146a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
146b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
146c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
146d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
146e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
146f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
14700 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
14710 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14720 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
14730 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
14740 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
14750 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
14760 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
14770 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
14780 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
14790 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
147a0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
147b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
147c0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
147d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
147e0 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
147f0 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
14800 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
14810 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
14820 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
14830 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
14840 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
14850 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
14860 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14870 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
14880 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
14890 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
148a0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
148b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
148c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
148d0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
148e0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
148f0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
14900 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
14910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
14920 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
14930 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
14940 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
14950 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
14960 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
14970 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
14980 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
14990 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
149a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
149b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
149c0 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
149d0 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
149e0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
149f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
14a00 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
14a10 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
14a20 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
14a30 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
14a40 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
14a50 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
14a60 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
14a70 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
14a80 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
14a90 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
14aa0 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
14ab0 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
14ac0 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
14ad0 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
14ae0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
14af0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
14b00 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
14b10 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
14b20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
14b30 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
14b40 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
14b50 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
14b60 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
14b70 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
14b80 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
14b90 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
14ba0 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
14bb0 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
14bc0 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
14bd0 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
14be0 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
14bf0 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
14c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
14c10 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
14c20 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
14c30 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
14c40 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
14c50 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
14c60 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
14c70 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
14c80 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
14c90 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
14ca0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
14cb0 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
14cc0 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
14cd0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
14ce0 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
14cf0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
14d00 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
14d10 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
14d20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
14d30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
14d40 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
14d50 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
14d60 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
14d70 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
14d80 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
14d90 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
14da0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
14db0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
14dc0 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
14dd0 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
14de0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
14df0 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
14e00 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
14e10 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
14e20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
14e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14e40 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
14e50 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
14e60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
14e70 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
14e80 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
14e90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
14ea0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
14eb0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
14ec0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14ed0 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
14ee0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
14ef0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14f00 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
14f10 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
14f20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
14f30 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
14f40 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
14f50 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
14f60 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
14f70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
14f80 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
14f90 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
14fa0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14fb0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
14fc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14fd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
14fe0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14ff0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
15000 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
15010 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15020 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
15030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15040 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
15050 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
15060 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
15070 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
15080 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
15090 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
150a0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
150b0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
150c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
150d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
150e0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
150f0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
15100 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
15110 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
15120 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
15130 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
15140 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
15150 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
15160 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
15170 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
15180 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
15190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
151a0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
151b0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
151c0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
151d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
151e0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
151f0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
15200 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
15220 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
15230 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
15250 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
15260 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
15270 41 4e 44 20 7a 0a 20 20 20 20 20 20 2a 2a 0a 20  AND z.      **. 
15280 20 20 20 20 20 2a 2a 20 49 73 20 65 71 75 69 76       ** Is equiv
15290 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
152a0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 78  **.      **    x
152b0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
152c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 43     **.      ** C
152d0 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
152e0 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
152f0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
15300 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
15310 20 2a 2a 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e   ** elementation
15320 20 6f 66 20 78 2e 0a 20 20 20 20 20 20 2a 2f 0a   of x..      */.
15330 20 20 20 20 20 20 45 78 70 72 20 65 78 70 72 41        Expr exprA
15340 6e 64 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  nd;.      Expr c
15350 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ompLeft;.      E
15360 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 0a 20  xpr compRight;. 
15370 20 20 20 20 20 45 78 70 72 20 65 78 70 72 58 3b       Expr exprX;
15380 0a 0a 20 20 20 20 20 20 65 78 70 72 58 20 3d 20  ..      exprX = 
15390 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
153a0 20 20 20 20 20 65 78 70 72 41 6e 64 2e 6f 70 20       exprAnd.op 
153b0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
153c0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
153d0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 20 20 20  &compLeft;.     
153e0 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20   exprAnd.pRight 
153f0 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20  = &compRight;.  
15400 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20      compLeft.op 
15410 3d 20 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20 63  = TK_GE;.      c
15420 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
15430 26 65 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f  &exprX;.      co
15440 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
15450 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
15460 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
15470 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
15480 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70  K_LE;.      comp
15490 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
154a0 78 70 72 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70  xprX;.      comp
154b0 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
154c0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
154d0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ].pExpr;.      e
154e0 78 70 72 58 2e 69 54 61 62 6c 65 20 3d 20 73 71  xprX.iTable = sq
154f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15500 70 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58  p(pParse, &exprX
15510 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15520 20 20 20 20 65 78 70 72 58 2e 6f 70 20 3d 20 54      exprX.op = T
15530 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20  K_REGISTER;.    
15540 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
15550 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78  alse(pParse, &ex
15560 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
15570 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
15580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15590 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
155a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
155b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
155c0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
155d0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
155e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
155f0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
15600 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
15610 3d 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  =0);.      break
15620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
15630 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15640 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
15650 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
15660 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15670 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
15680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
15690 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
156a0 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
156b0 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
156c0 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
156d0 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
156e0 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
156f0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
15700 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
15710 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65   way..**.** Some
15720 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
15730 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46  ne will return F
15740 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68 65  ALSE even if the
15750 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
15760 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
15770 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
15780 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
15790 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
157a0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
157b0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
157c0 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65  FALSE just to be
157d0 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
157e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
157f0 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65  turns false, the
15800 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
15810 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
15820 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
15830 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
15840 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
15850 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 54  t if you get a T
15860 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  RUE return, then
15870 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
15880 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
15890 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
158a0 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
158b0 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
158c0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
158d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
158e0 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
158f0 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a   FALSE - that.**
15900 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
15910 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
15920 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
15930 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
15940 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
15950 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20  TRUE could lead 
15960 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
15970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15980 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
15990 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
159a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
159b0 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a  pA==0||pB==0 ){.
159c0 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
159d0 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  A;.  }.  if( pA-
159e0 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65  >op!=pB->op ) re
159f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
15a00 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
15a10 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
15a20 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
15a30 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
15a40 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
15a50 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
15a60 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
15a70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15a80 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
15a90 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
15aa0 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
15ab0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
15ac0 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  A->pList ){.    
15ad0 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30  if( pB->pList==0
15ae0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
15af0 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e   if( pA->pList->
15b00 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74  nExpr!=pB->pList
15b10 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
15b20 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
15b30 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45   i<pA->pList->nE
15b40 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15b50 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
15b60 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69  rCompare(pA->pLi
15b70 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
15b80 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pB->pList->a[i].
15b90 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
15ba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
15bc0 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20  e if( pB->pList 
15bd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
15be0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70  .  }.  if( pA->p
15bf0 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53  Select || pB->pS
15c00 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
15c10 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62  ;.  if( pA->iTab
15c20 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c  le!=pB->iTable |
15c30 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  | pA->iColumn!=p
15c40 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
15c50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
15c60 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
15c70 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b  & pA->token.z ){
15c80 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
15c90 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  en.z==0 ) return
15ca0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   0;.    if( pB->
15cb0 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b  token.n!=pA->tok
15cc0 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  en.n ) return 0;
15cd0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15ce0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
15cf0 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61  pA->token.z,(cha
15d00 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70  r*)pB->token.z,p
15d10 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29  B->token.n)!=0 )
15d20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
15d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15d40 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 1;.}.../*.*
15d50 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
15d60 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
15d70 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
15d80 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
15d90 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
15da0 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
15db0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
15dc0 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
15dd0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
15de0 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
15df0 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64  olumn(sqlite3 *d
15e00 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
15e10 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
15e20 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c  Info->aCol = sql
15e30 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
15e40 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20  e(.       db,.  
15e50 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
15e60 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
15e70 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
15e80 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20  .       3,.     
15e90 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
15ea0 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  n,.       &pInfo
15eb0 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a  ->nColumnAlloc,.
15ec0 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
15ed0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
15ee0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
15ef0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
15f00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
15f10 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
15f20 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
15f30 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
15f40 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
15f50 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
15f60 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
15f70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
15f80 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69 74  ggInfoFunc(sqlit
15f90 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20  e3 *db, AggInfo 
15fa0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
15fb0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  ;.  pInfo->aFunc
15fc0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
15fd0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
15fe0 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e 66  db, .       pInf
15ff0 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->aFunc,.      
16000 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
16010 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20 20  Func[0]),.      
16020 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66   3,.       &pInf
16030 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
16040 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c   &pInfo->nFuncAl
16050 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  loc,.       &i. 
16060 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
16070 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
16080 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  s is an xFunc fo
16090 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
160a0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
160b0 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  nt .** sqlite3Ex
160c0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
160d0 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
160e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
160f0 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
16100 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
16110 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
16120 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
16130 7a 65 73 20 74 68 65 20 61 67 67 72 65 67 61 74  zes the aggregat
16140 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45  e function at pE
16150 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xpr..*/.static i
16160 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
16170 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ate(void *pArg, 
16180 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
16190 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
161a0 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
161b0 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b  eContext *)pArg;
161c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
161d0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
161e0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
161f0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
16200 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
16210 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
16220 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
16230 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
16240 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
16250 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
16260 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
16270 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
16280 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c  o see if the col
16290 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66  umn is in one of
162a0 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
162b0 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a  he FROM.      **
162c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
162d0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
162e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  /.      if( pSrc
162f0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
16300 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
16310 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
16320 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
16330 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
16340 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
16350 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
16360 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
16370 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
16380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
16390 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
163a0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20  em->iCursor ){. 
163b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
163c0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
163d0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
163e0 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73  hat pExpr refers
163f0 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20   to a table.    
16400 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
16410 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  is in the FROM c
16420 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
16430 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a  regate query.  .
16440 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20              **. 
16450 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61             ** Ma
16460 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ke an entry for 
16470 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41  the column in pA
16480 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69  ggInfo->aCol[] i
16490 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  f there.        
164a0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e      ** is not an
164b0 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72   entry there alr
164c0 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20  eady..          
164d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
164e0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
164f0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
16500 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
16510 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
16520 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  k<pAggInfo->nCol
16530 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; k++, pCol++
16540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16550 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
16560 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
16570 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
16580 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
16590 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
165a0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
165b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
165d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
165e0 20 20 20 20 20 20 20 20 69 66 28 20 28 6b 3e 3d          if( (k>=
165f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
16600 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n).             
16610 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e  && (k = addAggIn
16620 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d  foColumn(pParse-
16630 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e  >db, pAggInfo))>
16640 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
16650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16660 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
16670 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20  o->aCol[k];.    
16680 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
16690 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
166a0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
166b0 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
166c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
166e0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
166f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
16700 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
16710 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  ->iMem = ++pPars
16720 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
16730 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
16740 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
16750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
16760 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
16770 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
16780 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
16790 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
167a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
167b0 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
167c0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
167d0 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
167e0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
167f0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
16800 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
16810 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
16860 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
16880 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
16890 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
168a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
168b0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
168c0 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
168d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168f0 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
16900 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
16910 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
16920 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16930 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
16940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16980 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
16990 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
169a0 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
169b0 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
169d0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
169e0 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
169f0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
16a10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a30 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
16a40 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
16a50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
16a60 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
16a70 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
16a80 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
16a90 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
16aa0 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
16ab0 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
16ac0 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
16ad0 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
16ae0 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
16af0 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
16b00 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
16b10 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
16b20 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
16b30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
16b40 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
16b50 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
16b60 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
16b70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
16b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
16b90 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20  xpr->iAgg = k;. 
16ba0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
16bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
16bc0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
16bd0 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
16be0 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
16bf0 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
16c00 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
16c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
16c20 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
16c30 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
16c40 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
16c50 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
16c60 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
16c70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
16c80 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
16c90 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
16ca0 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
16cb0 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
16cc0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
16cd0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
16ce0 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
16cf0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
16d00 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
16d10 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
16d20 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
16d30 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
16d40 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
16d50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16d60 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
16d70 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
16d80 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
16d90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16da0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
16db0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
16dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
16dd0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
16de0 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
16df0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
16e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
16e30 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
16e40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
16e50 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
16e60 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
16e70 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
16e80 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
16e90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16ea0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
16eb0 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
16ec0 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
16ed0 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65  gInfoFunc(pParse
16ee0 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b  ->db, pAggInfo);
16ef0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
16f00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
16f10 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
16f20 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
16f30 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
16f40 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
16f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
16f60 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
16f70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
16f80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
16f90 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
16fa0 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
16fb0 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
16fc0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16fd0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
16fe0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
16ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17000 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
17010 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
17020 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
17030 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
17040 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
17050 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
17060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17070 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
17080 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
17090 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
170a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
170b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
170c0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
170d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
170e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
170f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
17100 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
17110 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
17120 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
17130 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
17140 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
17150 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
17160 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
17170 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
17180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
17190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
171a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69   }..  /* Recursi
171b0 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65  vely walk subque
171c0 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ries looking for
171d0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
171e0 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20   that need.  ** 
171f0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  to be changed to
17200 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
17210 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e   But increment n
17220 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20  Depth so that.  
17230 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ** TK_AGG_FUNCTI
17240 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71  ON nodes in subq
17250 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75  ueries will be u
17260 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
17270 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
17280 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
17290 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
172a0 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
172b0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
172c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
172d0 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
172e0 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
172f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
17300 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
17310 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
17320 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
17330 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
17340 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
17350 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
17360 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
17370 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
17380 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
17390 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
173a0 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
173b0 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
173c0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
173d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
173e0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
173f0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
17400 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
17410 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
17420 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
17430 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  lveNames()..*/.v
17440 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
17450 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
17460 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
17470 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
17480 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
17490 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
174a0 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 7d  gregate, pNC);.}
174b0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
174c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
174d0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
174e0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
174f0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
17500 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
17510 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17520 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
17530 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
17540 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
17550 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
17560 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
17570 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17580 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
17590 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
175a0 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
175b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
175c0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
175d0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
175e0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
175f0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
17600 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
17610 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
17620 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
17630 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
17640 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
17650 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17660 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
17670 65 61 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72  eallocate tempor
17680 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
17690 73 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  s during code ge
176a0 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  neration..*/.int
176b0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
176c0 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
176d0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
176e0 3e 6e 54 65 6d 70 52 65 67 20 29 7b 0a 20 20 20  >nTempReg ){.   
176f0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
17700 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
17710 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 20 20  e->nTempReg];.  
17720 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17730 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
17740 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
17750 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17760 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
17770 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69  , int iReg){.  i
17780 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73  f( iReg && pPars
17790 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61  e->nTempReg<Arra
177a0 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54  ySize(pParse->aT
177b0 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 61  empReg) ){.    a
177c0 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 29 3b  ssert( iReg>0 );
177d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
177e0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
177f0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
17800 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
17810 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
17820 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
17830 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
17840 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
17850 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
17860 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
17870 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
17880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17890 6e 52 65 67 3c 3d 70 50 61 72 73 65 2d 3e 6e 52  nReg<=pParse->nR
178a0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 69  angeReg ){.    i
178b0 20 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e    = pParse->iRan
178c0 67 65 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73  geReg;.    pPars
178d0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
178e0 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
178f0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
17900 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
17910 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
17920 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
17930 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
17940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
17950 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
17960 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
17970 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17980 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
17990 29 7b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50  ){.  if( nReg>pP
179a0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
179b0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
179c0 52 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b  RangeReg = nReg;
179d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
179e0 6e 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ngeReg = iReg;. 
179f0 20 7d 0a 7d 0a                                    }.}.