/ Hex Artifact Content
Login

Artifact 8c32309dedd13b8ab220348eb90dc221ee0a5174:


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 31 37 20 32 30 30 37 2f 31 31 2f 32 39 20  .317 2007/11/29 
0220: 31 37 3a 30 35 3a 31 38 20 64 61 6e 69 65 6c 6b  17:05:18 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 31 20 76 61 6c 75  turn the P1 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: 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  * If jumpIfNull 
1350: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 65  is true, then se
1360: 74 20 74 68 65 20 6c 6f 77 20 62 79 74 65 20 6f  t the low byte o
1370: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  f the returned.*
1380: 2a 20 50 31 20 76 61 6c 75 65 20 74 6f 20 74 65  * P1 value to te
1390: 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  ll the opcode to
13a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
13b0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 76  expression.** ev
13c0: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
13d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
13e0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 45  inaryCompareP1(E
13f0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1400: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1410: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 63 68  umpIfNull){.  ch
1420: 61 72 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  ar aff = sqlite3
1430: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
1440: 70 72 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  pr2);.  return (
1450: 28 69 6e 74 29 73 71 6c 69 74 65 33 43 6f 6d 70  (int)sqlite3Comp
1460: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1470: 72 31 2c 20 61 66 66 29 29 2b 28 6a 75 6d 70 49  r1, aff))+(jumpI
1480: 66 4e 75 6c 6c 3f 30 78 31 30 30 3a 30 29 3b 0a  fNull?0x100:0);.
1490: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
14a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14c0: 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nce that should 
14d0: 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20  be used by.** a 
14e0: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
14f0: 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61  n operator compa
1500: 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70  ring pLeft and p
1510: 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Right..**.** If 
1520: 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78  the left hand ex
1530: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63  pression has a c
1540: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1550: 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20  e type, then it 
1560: 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65  is.** used. Othe
1570: 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  rwise the collat
1580: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
1590: 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20   the right hand 
15a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
15b0: 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65   used, or the de
15c0: 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69  fault (BINARY) i
15d0: 66 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73  f neither expres
15e0: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
15f0: 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a  ting.** type..**
1600: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69  .** Argument pRi
1610: 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65  ght (but not pLe
1620: 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c  ft) may be a nul
1630: 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68  l pointer. In th
1640: 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69  is case,.** it i
1650: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1660: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
1670: 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
1680: 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72  reCollSeq(.  Par
1690: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45  se *pParse, .  E
16a0: 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45  xpr *pLeft, .  E
16b0: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
16c0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
16d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
16e0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d   );.  if( pLeft-
16f0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1700: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
1710: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f  sert( pLeft->pCo
1720: 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ll );.    pColl 
1730: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1740: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1750: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c  ht && pRight->fl
1760: 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
1770: 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ate ){.    asser
1780: 74 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  t( pRight->pColl
1790: 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   );.    pColl = 
17a0: 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20  pRight->pColl;. 
17b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c   }else{.    pCol
17c0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
17d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
17e0: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21  Left);.    if( !
17f0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
1800: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1810: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1820: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  , pRight);.    }
1830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
1840: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
1850: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1860: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
1870: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
1880: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
1890: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
18a0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
18b0: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
18c0: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
18d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
18e0: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
18f0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1900: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1910: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1920: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1930: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
1940: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
1950: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
1960: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1970: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1980: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
1990: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
19a0: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
19b0: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
19c0: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
19d0: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
19e0: 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74  yCompareP1(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 43 6f 6c 6c 53 65 71  Null);.  CollSeq
1a10: 20 2a 70 33 20 3d 20 73 71 6c 69 74 65 33 42 69   *p3 = sqlite3Bi
1a20: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1a30: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1a40: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74  , pRight);.  ret
1a50: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4f  urn sqlite3VdbeO
1a60: 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
1a70: 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 64 65  , opcode, p1, de
1a80: 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c 20 50  st, (void*)p3, P
1a90: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f  3_COLLSEQ);.}../
1aa0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1ab0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1ac0: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1ad0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1ae0: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1af0: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1b00: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1b10: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
1b20: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1b30: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1b40: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1b50: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1b60: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1b70: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
1b80: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
1b90: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1ba0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
1bb0: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
1bc0: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
1bd0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
1be0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1bf0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
1c00: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
1c10: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
1c20: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
1c30: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1c40: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
1c50: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
1c60: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
1c70: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
1c80: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
1c90: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
1ca0: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1cb0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1cc0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
1cd0: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  xpr));.  if( pNe
1ce0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
1cf0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
1d00: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
1d10: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
1d20: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
1d30: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
1d40: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
1d50: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
1d60: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
1d70: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
1d80: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
1d90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
1da0: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
1db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1dc0: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
1dd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1de0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
1df0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
1e00: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
1e10: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
1e20: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
1e30: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
1e40: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
1e50: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
1e60: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
1e70: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
1e80: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
1e90: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
1ea0: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
1eb0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ec0: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
1ed0: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
1ee0: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
1ef0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
1f00: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1f10: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
1f20: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1f30: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1f40: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
1f50: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
1f60: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1f70: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
1f80: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1f90: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1fa0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
1fb0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
1fc0: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
1fd0: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1ff0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2000: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2010: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
2020: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
2030: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
2040: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
2050: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
2060: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
2070: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
2080: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
2090: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
20a0: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
20b0: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
20c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
20e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20f0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2110: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
2120: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
2130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2140: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
2150: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
2160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
2170: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2180: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
2190: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
21a0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
21b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21c0: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
21d0: 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67   op, pLeft, pRig
21e0: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a  ht, pToken);.}..
21f0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
2200: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
2210: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
2220: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
2230: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
2240: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
2250: 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20 20    #0 #1 #2 ...  
2260: 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66 65  These terms refe
2270: 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a  r to elements.**
2280: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
2290: 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65 20 74  "#0" means the t
22a0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
22b0: 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20 74  .** "#1" means t
22c0: 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20  he next down on 
22d0: 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64 20  the stack.  And 
22e0: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20  so forth..**.** 
22f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2300: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
2310: 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74  rser to deal wit
2320: 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65  h on of those te
2330: 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64  rms..** It immed
2340: 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73  iately generates
2350: 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74   code to store t
2360: 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65  he value in a me
2370: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
2380: 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e  * The returns an
2390: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
23a0: 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78   will code to ex
23b0: 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
23c0: 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d  from.** that mem
23d0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20  ory location as 
23e0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  needed..*/.Expr 
23f0: 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72  *sqlite3Register
2400: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
2410: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
2420: 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  n){.  Vdbe *v = 
2430: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2440: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20   Expr *p;.  int 
2450: 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70 50 61  depth;.  if( pPa
2460: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
2470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
2480: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2490: 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74  ear \"%T\": synt
24a0: 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65  ax error", pToke
24b0: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  n);.    return s
24c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
24d0: 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20  se, TK_NULL, 0, 
24e0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
24f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
2500: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 50  ;.  p = sqlite3P
2510: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2520: 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20  REGISTER, 0, 0, 
2530: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70  pToken);.  if( p
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2550: 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  n 0;  /* Malloc 
2560: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2570: 64 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68  depth = atoi((ch
2580: 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  ar*)&pToken->z[1
2590: 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ]);.  p->iTable 
25a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
25b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
25c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
25d0: 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c  depth, 0);.  sql
25e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
25f0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d   OP_MemStore, p-
2600: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72  >iTable, 1);.  r
2610: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2620: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
2630: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
2640: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
2650: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
2660: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
2670: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2680: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
2690: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
26a0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 73  sqlite3ExprAnd(s
26b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
26c0: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
26d0: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
26e0: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
26f0: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
2700: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
2710: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2720: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b   pLeft;.  }else{
2730: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
2740: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
2750: 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ND, pLeft, pRigh
2760: 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 0);.  }.}../*
2770: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2780: 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74  .span field of t
2790: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
27a0: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
27b0: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
27c0: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
27d0: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
27e0: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45 78  lite3ExprSpan(Ex
27f0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
2800: 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a   *pLeft, Token *
2810: 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72  pRight){.  asser
2820: 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  t( pRight!=0 );.
2830: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
2840: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
2850: 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26  r && pRight->z &
2860: 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  & pLeft->z ){.  
2870: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
2880: 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74  >dyn==0 || pLeft
2890: 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30  ->z[pLeft->n]==0
28a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66   );.    if( pLef
28b0: 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69  t->dyn==0 && pRi
28c0: 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20  ght->dyn==0 ){. 
28d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
28e0: 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20  .z = pLeft->z;. 
28f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
2900: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
2910: 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c   (pRight->z - pL
2920: 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  eft->z);.    }el
2930: 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  se{.      pExpr-
2940: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  >span.z = 0;.   
2950: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2960: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
2970: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2980: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
2990: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
29a0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
29b0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
29c0: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
29d0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
29e0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
29f0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
2a00: 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  pNew;.  assert( 
2a10: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
2a20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2a30: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
2a40: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20  b, sizeof(Expr) 
2a50: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
2a60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2a70: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
2a80: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c  ist); /* Avoid l
2a90: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68  eaking memory wh
2aa0: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
2ab0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
2ac0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
2ad0: 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  = TK_FUNCTION;. 
2ae0: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70   pNew->pList = p
2af0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
2b00: 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29  pToken->dyn==0 )
2b10: 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20  ;.  pNew->token 
2b20: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65  = *pToken;.  pNe
2b30: 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e  w->span = pNew->
2b40: 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65  token;..  sqlite
2b50: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70  3ExprSetHeight(p
2b60: 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  New);.  return p
2b70: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
2b80: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
2b90: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
2ba0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
2bb0: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
2bc0: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
2bd0: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
2be0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
2bf0: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
2c00: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
2c10: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
2c20: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
2c30: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
2c40: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
2c50: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2c60: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
2c70: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
2c80: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
2c90: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
2ca0: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
2cb0: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
2cc0: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
2cd0: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
2ce0: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
2cf0: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
2d00: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
2d10: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
2d20: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
2d30: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
2d40: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
2d50: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
2d60: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
2d70: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
2d80: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
2d90: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
2da0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2db0: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
2dc0: 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72  xt sequenial var
2dd0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
2de0: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
2df0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2e00: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
2e10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
2e20: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54  xpr *pExpr){.  T
2e30: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  oken *pToken;.  
2e40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2e50: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
2e60: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
2e70: 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26  rn;.  pToken = &
2e80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
2e90: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2ea0: 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
2eb0: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29  ( pToken->z!=0 )
2ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2ed0: 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20  en->z[0]!=0 );. 
2ee0: 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d   if( pToken->n==
2ef0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  1 ){.    /* Wild
2f00: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
2f10: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
2f20: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
2f30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45  number */.    pE
2f40: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b  xpr->iTable = ++
2f50: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
2f60: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e  }else if( pToken
2f70: 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20  ->z[0]=='?' ){. 
2f80: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2f90: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e  f the form "?nnn
2fa0: 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e  ".  Convert "nnn
2fb0: 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  " to an integer 
2fc0: 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69  and.    ** use i
2fd0: 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c  t as the variabl
2fe0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
2ff0: 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72  int i;.    pExpr
3000: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61  ->iTable = i = a
3010: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
3020: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69  en->z[1]);.    i
3030: 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49  f( i<1 || i>SQLI
3040: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
3050: 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20 20  NUMBER ){.      
3060: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3070: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
3080: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
3090: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
30a0: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
30b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
30c0: 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20  BLE_NUMBER);.   
30d0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61   }.    if( i>pPa
30e0: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
30f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
3100: 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = i;.    }.  }el
3110: 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63  se{.    /* Wildc
3120: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
3130: 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61   ":aaa" or "$aaa
3140: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
3150: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
3160: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
3170: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
3180: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
3190: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
31a0: 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  me.    ** has ne
31b0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
31c0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
31d0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
31e0: 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ber.    */.    i
31f0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d  nt i, n;.    n =
3200: 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20   pToken->n;.    
3210: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
3220: 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b  e->nVarExpr; i++
3230: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
3240: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45  E;.      if( (pE
3250: 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72   = pParse->apVar
3260: 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20  Expr[i])!=0.    
3270: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b        && pE->tok
3280: 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20  en.n==n.        
3290: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e    && memcmp(pE->
32a0: 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d  token.z, pToken-
32b0: 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  >z, n)==0 ){.   
32c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
32d0: 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b  le = pE->iTable;
32e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3300: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
3310: 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20  >nVarExpr ){.   
3320: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3330: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61   = ++pParse->nVa
3340: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  r;.      if( pPa
3350: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70  rse->nVarExpr>=p
3360: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
3370: 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  lloc-1 ){.      
3380: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3390: 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73  prAlloc += pPars
33a0: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
33b0: 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70   + 10;.        p
33c0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
33d0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   =.            s
33e0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
33f0: 72 46 72 65 65 28 0a 20 20 20 20 20 20 20 20 20  rFree(.         
3400: 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
3410: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3420: 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20  pVarExpr,.      
3430: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3440: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69  nVarExprAlloc*si
3450: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56  zeof(pParse->apV
3460: 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20 20 20  arExpr[0]).     
3470: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
3480: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d  }.      if( !db-
3490: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
34a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34b0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
34c0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
34d0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
34e0: 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  pr[pParse->nVarE
34f0: 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a  xpr++] = pExpr;.
3500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3510: 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  } .  if( !pParse
3520: 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65  ->nErr && pParse
3530: 2d 3e 6e 56 61 72 3e 53 51 4c 49 54 45 5f 4d 41  ->nVar>SQLITE_MA
3540: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
3550: 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
3560: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3570: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
3580: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
3590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
35a0: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
35b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
35c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
35d0: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
35e0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
35f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3600: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
3610: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
3620: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
3630: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
3640: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
3650: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
3660: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3670: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
3680: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
3690: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
36a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
36b0: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
36c0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
36d0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
36e0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
36f0: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
3700: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
3710: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
3720: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
3730: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
3740: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
3750: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
3760: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
3770: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
3780: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
3790: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
37a0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
37b0: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
37c0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
37d0: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
37e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
37f0: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3800: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
3820: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e  kenCopy(db, &p->
3830: 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e  token, &p->token
3840: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3850: 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70  Dequote((char*)p
3860: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a  ->token.z);.}...
3870: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3880: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
3890: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
38a0: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
38b0: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
38c0: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
38d0: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
38e0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
38f0: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
3900: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
3910: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
3920: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
3930: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
3940: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
3950: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
3960: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
3970: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
3980: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
3990: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
39a0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
39b0: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
39c0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
39d0: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
39e0: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
39f0: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
3a00: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
3a10: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
3a20: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
3a30: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
3a40: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
3a50: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
3a60: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
3a70: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
3a80: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
3a90: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
3aa0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
3ab0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3ac0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3ad0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3ae0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3af0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
3b00: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3b10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3b20: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
3b30: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
3b40: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
3b50: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  z!=0 ){.    pNew
3b60: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a  ->token.z = (u8*
3b70: 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75  )sqlite3DbStrNDu
3b80: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
3b90: 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65  token.z, p->toke
3ba0: 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n.n);.    pNew->
3bb0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  token.dyn = 1;. 
3bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
3bd0: 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e  rt( pNew->token.
3be0: 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e  z==0 );.  }.  pN
3bf0: 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  ew->span.z = 0;.
3c00: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
3c10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
3c20: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
3c30: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
3c40: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
3c50: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
3c60: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
3c70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3c80: 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  (db, p->pList);.
3c90: 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20    pNew->pSelect 
3ca0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3cb0: 75 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63  up(db, p->pSelec
3cc0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
3cd0: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
3ce0: 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74  3TokenCopy(sqlit
3cf0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
3d00: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
3d10: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3d20: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
3d30: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
3d40: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
3d50: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
3d60: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
3d70: 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69  o->z = (u8*)sqli
3d80: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
3d90: 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a   (char*)pFrom->z
3da0: 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20  , pFrom->n);.   
3db0: 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20   pTo->dyn = 1;. 
3dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d   }else{.    pTo-
3dd0: 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78  >z = 0;.  }.}.Ex
3de0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
3df0: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
3e00: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
3e10: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
3e20: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3e30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3e40: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3e50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3e60: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3e70: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3e80: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
3e90: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
3ea0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
3eb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3ec0: 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  New->iECursor = 
3ed0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
3ee0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3ef0: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
3f00: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
3f10: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
3f20: 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72  aw(db,  p->nExpr
3f30: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
3f40: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
3f50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3f60: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
3f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
3f80: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
3f90: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
3fa0: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
3fb0: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
3fc0: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
3fd0: 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45  pNewExpr, *pOldE
3fe0: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
3ff0: 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72  pExpr = pNewExpr
4000: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4010: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d  p(db, pOldExpr =
4020: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
4030: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
4040: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
4050: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
4060: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
4070: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
4080: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
4090: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
40a0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
40b0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
40c0: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
40d0: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
40e0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
40f0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
4100: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
4110: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
4120: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
4130: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
4140: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
4150: 79 28 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d  y(db, &pNewExpr-
4160: 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72  >span, &pOldExpr
4170: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
4180: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
4190: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78  xpr==0 || pNewEx
41a0: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20  pr->span.z!=0 . 
41b0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f             || pO
41c0: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d  ldExpr->span.z==
41d0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
41e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
41f0: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
4200: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
4210: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
4220: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4230: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
4240: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
4250: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
4260: 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c  tem->isAgg = pOl
4270: 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20  dItem->isAgg;.  
4280: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
4290: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
42a0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
42b0: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
42c0: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
42d0: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
42e0: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
42f0: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
4300: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
4310: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
4320: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
4330: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4340: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
4350: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
4360: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
4370: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
4380: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
4390: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
43a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
43b0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
43c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
43d0: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
43e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
43f0: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
4400: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
4410: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
4420: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 29 7b  db, SrcList *p){
4430: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
4440: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4450: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
4460: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4470: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
4480: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
4490: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
44a0: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
44b0: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
44c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
44d0: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
44e0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
44f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4500: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
4510: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
4520: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4530: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
4540: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4550: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4560: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4570: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4580: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
4590: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
45a0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
45b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
45c0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62  base = sqlite3Db
45d0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
45e0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
45f0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
4600: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4610: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
4620: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
4630: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
4640: 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  s = sqlite3DbStr
4650: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
4660: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
4670: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
4680: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
4690: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
46a0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
46b0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
46c0: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
46d0: 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70  >isPopulated = p
46e0: 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  OldItem->isPopul
46f0: 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62 20 3d  ated;.    pTab =
4700: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
4710: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
4720: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
4730: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
4740: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
4750: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
4760: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
4770: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
4780: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
4790: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
47a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
47b0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
47c0: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  n);.    pNewItem
47d0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
47e0: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
47f0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
4800: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4810: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
4820: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
4830: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4840: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
4850: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
4860: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
4870: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
4880: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
4890: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
48a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
48b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
48c0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
48d0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
48e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
48f0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
4900: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
4910: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
4920: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4930: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
4940: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
4950: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
4960: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4970: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
4980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4990: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
49a0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
49b0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
49c0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
49d0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
49e0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
49f0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
4a00: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
4a10: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4a20: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4a30: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
4a40: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
4a50: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
4a60: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
4a70: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
4a80: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
4a90: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
4aa0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
4ab0: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
4ac0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4ad0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
4ae0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
4af0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
4b00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4b10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4b20: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
4b30: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
4b40: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
4b50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4b60: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
4b70: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
4b80: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
4b90: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
4ba0: 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  c);.  pNew->pWhe
4bb0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
4bc0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
4bd0: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
4be0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
4bf0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
4c00: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e  >pGroupBy);.  pN
4c10: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
4c20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4c30: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
4c40: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
4c50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4c60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
4c70: 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rBy);.  pNew->op
4c80: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
4c90: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
4ca0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
4cb0: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4cc0: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
4cd0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
4ce0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e  p->pLimit);.  pN
4cf0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
4d00: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
4d10: 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
4d20: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
4d30: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
4d40: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
4d50: 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d  >isResolved = p-
4d60: 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70  >isResolved;.  p
4d70: 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  New->isAgg = p->
4d80: 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75  isAgg;.  pNew->u
4d90: 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70  sesEphm = 0;.  p
4da0: 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64  New->disallowOrd
4db0: 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  erBy = 0;.  pNew
4dc0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
4dd0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
4de0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
4df0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
4e00: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
4e10: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
4e20: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
4e30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
4e40: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
4e50: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
4e60: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
4e70: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4e80: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
4e90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
4ea0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
4eb0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
4ec0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4ed0: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
4ee0: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
4ef0: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
4f00: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
4f10: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
4f20: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4f30: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
4f40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4f60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4f70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
4f80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
4f90: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
4fa0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
4fb0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
4fc0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
4fd0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
4fe0: 20 62 65 20 61 70 70 65 6e 64 65 64 20 2a 2f 0a   be appended */.
4ff0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20    Token *pName  
5000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 53 20            /* AS 
5010: 6b 65 79 77 6f 72 64 20 66 6f 72 20 74 68 65 20  keyword for the 
5020: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
5030: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5040: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
5050: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
5060: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5070: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
5080: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
5090: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
50a0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
50b0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
50c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
50d0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
50e0: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
50f0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
5100: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
5110: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5120: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e  _item *a;.    in
5130: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  t n = pList->nAl
5140: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61  loc*2 + 4;.    a
5150: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
5160: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
5170: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
5180: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
5190: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
51a0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
51b0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
51c0: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
51d0: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a  nAlloc = n;.  }.
51e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
51f0: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
5200: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
5210: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
5220: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5230: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
5240: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
5250: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
5260: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
5270: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ));.    pItem->z
5280: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5290: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
52a0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  pName);.    pIte
52b0: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
52c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
52d0: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
52e0: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
52f0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
5300: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
5310: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
5320: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
5330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
5340: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
5350: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
5360: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
5370: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
5380: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
5390: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
53a0: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
53b0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
53c0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
53d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
53e0: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
53f0: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
5400: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
5410: 70 45 4c 69 73 74 2c 0a 20 20 69 6e 74 20 69 4c  pEList,.  int iL
5420: 69 6d 69 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68  imit,.  const ch
5430: 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20  ar *zObject.){. 
5440: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
5450: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 69 4c 69  EList->nExpr>iLi
5460: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
5470: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5480: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
5490: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
54a0: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23  ject);.  }.}...#
54b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
54c0: 45 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54  E_TEST) || SQLIT
54d0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
54e0: 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  >0./* The follow
54f0: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
5500: 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70  ons, heightOfExp
5510: 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70  r(), heightOfExp
5520: 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68  rList().** and h
5530: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c  eightOfSelect(),
5540: 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65 74   are used to det
5550: 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d  ermine the maxim
5560: 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20  um height.** of 
5570: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  any expression t
5580: 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  ree referenced b
5590: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
55a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
55b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
55c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
55d0: 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73  aximum height is
55e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
55f0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
5600: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
5610: 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73   pnHeight, the s
5620: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
5630: 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69   then set *pnHei
5640: 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  ght to that.** v
5650: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
5660: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
5670: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
5680: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5690: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
56a0: 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67  >nHeight>*pnHeig
56b0: 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48  ht ){.      *pnH
56c0: 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67  eight = p->nHeig
56d0: 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
56e0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69 67  static void heig
56f0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70  htOfExprList(Exp
5700: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70  rList *p, int *p
5710: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
5720: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
5730: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5740: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5750: 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70       heightOfExp
5760: 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  r(p->a[i].pExpr,
5770: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5780: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
5790: 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65  oid heightOfSele
57a0: 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
57b0: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
57c0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69  if( p ){.    hei
57d0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68  ghtOfExpr(p->pWh
57e0: 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ere, pnHeight);.
57f0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5800: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48  (p->pHaving, pnH
5810: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5820: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d  htOfExpr(p->pLim
5830: 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  it, pnHeight);. 
5840: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5850: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65  p->pOffset, pnHe
5860: 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68  ight);.    heigh
5870: 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  tOfExprList(p->p
5880: 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29  EList, pnHeight)
5890: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
58a0: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
58b0: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
58c0: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
58d0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
58e0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
58f0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
5900: 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67  ->pPrior, pnHeig
5910: 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ht);.  }.}../*.*
5920: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
5930: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
5940: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
5950: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a   passed as an .*
5960: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65  * argument. An e
5970: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e  xpression with n
5980: 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72  o children, Expr
5990: 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78  .pList or .** Ex
59a0: 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65  pr.pSelect membe
59b0: 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20 6f  r has a height o
59c0: 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65  f 1. Any other e
59d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73  xpression.** has
59e0: 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c 20   a height equal 
59f0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  to the maximum h
5a00: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68  eight of any oth
5a10: 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  er .** reference
5a20: 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e  d Expr plus one.
5a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5a40: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 45 78  ExprSetHeight(Ex
5a50: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48  pr *p){.  int nH
5a60: 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69  eight = 0;.  hei
5a70: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65  ghtOfExpr(p->pLe
5a80: 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  ft, &nHeight);. 
5a90: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5aa0: 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68  >pRight, &nHeigh
5ab0: 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78  t);.  heightOfEx
5ac0: 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c  prList(p->pList,
5ad0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
5ae0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
5af0: 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68  pSelect, &nHeigh
5b00: 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74  t);.  p->nHeight
5b10: 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a   = nHeight + 1;.
5b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b30: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5b40: 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73  ht of any expres
5b50: 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65  sion tree refere
5b60: 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  nced.** by the s
5b70: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5b80: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
5b90: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
5ba0: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
5bb0: 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29  eight(Select *p)
5bc0: 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20  {.  int nHeight 
5bd0: 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53  = 0;.  heightOfS
5be0: 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68  elect(p, &nHeigh
5bf0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65  t);.  return nHe
5c00: 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ight;.}.#endif..
5c10: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
5c20: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
5c30: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
5c40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5c50: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
5c60: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
5c70: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
5c80: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
5c90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5ca0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
5cb0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
5cc0: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
5cd0: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
5ce0: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
5cf0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
5d00: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
5d10: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
5d20: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
5d30: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
5d40: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
5d50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5d60: 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ete(pItem->pExpr
5d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5d80: 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
5d90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
5da0: 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  _free(pList->a);
5db0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5dc0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
5dd0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
5de0: 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20  ion tree.  Call 
5df0: 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e  xFunc for each n
5e00: 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a  ode visited..**.
5e10: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5e20: 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64  lue from xFunc d
5e30: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
5e40: 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20  r the tree walk 
5e50: 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20  continues..** 0 
5e60: 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77  means continue w
5e70: 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e  alking the tree.
5e80: 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74    1 means do not
5e90: 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a   walk children.*
5ea0: 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
5eb0: 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e   node but contin
5ec0: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73  ue with siblings
5ed0: 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64  .  2 means aband
5ee0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77  on.** the tree w
5ef0: 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  alk completely..
5f00: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
5f10: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73   value from this
5f20: 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f   routine is 1 to
5f30: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
5f40: 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20  e walk.** and 0 
5f50: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
5f60: 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73  ** NOTICE:  This
5f70: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e   routine does *n
5f80: 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  ot* descend into
5f90: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
5fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
5fb0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
5fc0: 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64   *, int (*)(void
5fd0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
5fe0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
5ff0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
6000: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
6010: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
6020: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
6030: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
6040: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
6050: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a  urn 0;.  rc = (*
6060: 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78  xFunc)(pArg, pEx
6070: 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  pr);.  if( rc==0
6080: 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   ){.    if( walk
6090: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
60a0: 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41  pLeft, xFunc, pA
60b0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
60c0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
60d0: 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Tree(pExpr->pRig
60e0: 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ht, xFunc, pArg)
60f0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
6100: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73   if( walkExprLis
6110: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
6120: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
6130: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
6140: 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f  eturn rc>1;.}../
6150: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6160: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
6170: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
6180: 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74   list p..*/.stat
6190: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c  ic int walkExprL
61a0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
61b0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
61c0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
61d0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
61e0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
61f0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6200: 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  m;.  if( !p ) re
6210: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6220: 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  p->nExpr, pItem=
6230: 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  p->a; i>0; i--, 
6240: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
6250: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
6260: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75  Item->pExpr, xFu
6270: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
6280: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6290: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
62a0: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
62b0: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
62c0: 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63  ression in Selec
62d0: 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  t p, not includi
62e0: 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
62f0: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
6300: 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  of sub-selects i
6310: 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73  n any FROM claus
6320: 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a  e or the LIMIT.*
6330: 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72  * or OFFSET expr
6340: 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61  essions...*/.sta
6350: 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65  tic int walkSele
6360: 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70  ctExpr(Select *p
6370: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
6380: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
6390: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61  oid *pArg){.  wa
63a0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  lkExprList(p->pE
63b0: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
63c0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
63d0: 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46  ee(p->pWhere, xF
63e0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
63f0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  lkExprList(p->pG
6400: 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70  roupBy, xFunc, p
6410: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
6420: 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Tree(p->pHaving,
6430: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6440: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
6450: 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63  >pOrderBy, xFunc
6460: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
6470: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
6480: 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70  walkSelectExpr(p
6490: 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c  ->pPrior, xFunc,
64a0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65   pArg);.  }.  re
64b0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
64c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
64d0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
64e0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
64f0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
6500: 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20   pArg is really 
6510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
6520: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20  integer.  If we 
6530: 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b  can tell by look
6540: 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20  ing.** at pExpr 
6550: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
6560: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
6570: 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  s pExpr is not a
6580: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
6590: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ression, then se
65a0: 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64  t *pArg to 0 and
65b0: 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61   return 2 to aba
65c0: 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61  ndon the tree wa
65d0: 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  lk..** If pExpr 
65e0: 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69  does does not di
65f0: 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70  squalify the exp
6600: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69  ression from bei
6610: 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ng a constant.**
6620: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
6630: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61  ..**.** After wa
6640: 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20  lking the whole 
6650: 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65  tree, if no node
6660: 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74  s are found that
6670: 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74   disqualify.** t
6680: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  he expression as
6690: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
66a0: 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68  we assume the wh
66b0: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ole expression.*
66c0: 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  * is constant.  
66d0: 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  See sqlite3ExprI
66e0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20  sConstant() for 
66f0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
6700: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
6710: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
6720: 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70  Constant(void *p
6730: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
6740: 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28  ){.  int *pN = (
6750: 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a  int*)pArg;..  /*
6760: 20 49 66 20 2a 70 41 72 67 20 69 73 20 33 20 74   If *pArg is 3 t
6770: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
6780: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
6790: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
67a0: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
67b0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
67c0: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
67d0: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
67e0: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
67f0: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
6800: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
6810: 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72  (*pN)==3 && Expr
6820: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
6830: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
6840: 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20  n) ){.    *pN = 
6850: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  0;.    return 2;
6860: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
6870: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6880: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
6890: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
68a0: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
68b0: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
68c0: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
68d0: 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f   and *pArg==2 */
68e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
68f0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
6900: 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75   (*pN)==2 ) retu
6910: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
6920: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
6930: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
6940: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
6950: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
6960: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
6970: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
6980: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
6990: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
69a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
69b0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
69c0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
69d0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
69e0: 66 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b  f.      *pN = 0;
69f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
6a00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
6a10: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
6a20: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
6a30: 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20       *pN = 0;.  
6a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
6a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61        }.    defa
6a60: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
6a70: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
6a80: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
6a90: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
6aa0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
6ab0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
6ac0: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
6ad0: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
6ae0: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
6af0: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   calls..**.** Fo
6b00: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
6b10: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
6b20: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
6b30: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
6b40: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
6b50: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
6b60: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
6b70: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
6b80: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
6b90: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
6ba0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6bb0: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
6bc0: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
6bd0: 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  1;.  walkExprTre
6be0: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
6bf0: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
6c00: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
6c10: 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  onst;.}../*.** W
6c20: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
6c30: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
6c40: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
6c50: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
6c60: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
6c70: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
6c80: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
6c90: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
6ca0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
6cb0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
6cc0: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
6cd0: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
6ce0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
6cf0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
6d00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
6d10: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
6d20: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
6d30: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33   int isConst = 3
6d40: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
6d50: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
6d60: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
6d70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
6d80: 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nst!=0;.}../*.**
6d90: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
6da0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
6db0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
6dc0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
6dd0: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
6de0: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
6df0: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
6e00: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
6e10: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
6e20: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
6e30: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
6e40: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
6e50: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
6e60: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
6e70: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
6e80: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
6e90: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
6ea0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
6eb0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
6ec0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
6ed0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6ee0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
6ef0: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a  ction(Expr *p){.
6f00: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
6f10: 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  2;.  walkExprTre
6f20: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
6f30: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
6f40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
6f50: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
6f60: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
6f70: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
6f80: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
6f90: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
6fa0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
6fb0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
6fc0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
6fd0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
6fe0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
6ff0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
7000: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7010: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
7020: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
7030: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
7040: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
7050: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
7060: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
7070: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
7080: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
7090: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
70a0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
70b0: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  e){.  switch( p-
70c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
70d0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
70e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
70f0: 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70  etInt32((char*)p
7100: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75  ->token.z, pValu
7110: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
7120: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7140: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
7150: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65  PLUS: {.      re
7160: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
7170: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
7180: 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20  ft, pValue);.   
7190: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
71a0: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
71b0: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
71c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
71d0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
71e0: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  v) ){.        *p
71f0: 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20  Value = -v;.    
7200: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7210: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7230: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
7240: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7250: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
7260: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
7270: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
7280: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
7290: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
72a0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
72b0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
72c0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
72d0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
72e0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
72f0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
7300: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
7310: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7320: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
7330: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
7340: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
7350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
7360: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
7370: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d  lumn of the form
7380: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
7390: 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70   just Z, look up
73a0: 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e  .** that name in
73b0: 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72   the set of sour
73c0: 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  ce tables in pSr
73d0: 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74  cList and make t
73e0: 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70  he pExpr .** exp
73f0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66  ression node ref
7400: 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20  er back to that 
7410: 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  source column.  
7420: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
7430: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
7440: 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a  e to pExpr:.**.*
7450: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20  *    pExpr->iDb 
7460: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68            Set th
7470: 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61  e index in db->a
7480: 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61  Db[] of the data
7490: 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  base holding.** 
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c          the tabl
74c0: 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  e..**    pExpr->
74d0: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
74e0: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
74f0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7500: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
7530: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
7540: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20  xpr->iColumn    
7550: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f     Set to the co
7560: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
7570: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
7580: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
7590: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20           Set to 
75a0: 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20  TK_COLUMN..**   
75b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20   pExpr->pLeft   
75c0: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
75d0: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
75e0: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a   to is deleted.*
75f0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  *    pExpr->pRig
7600: 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  ht        Any ex
7610: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
7620: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
7630: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44  ed..**.** The pD
7640: 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  bToken is the na
7650: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7660: 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54  se (the "X").  T
7670: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
7680: 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67  .** NULL meaning
7690: 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66   that name is of
76a0: 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72   the form Y.Z or
76b0: 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62   Z.  Any availab
76c0: 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  le database.** c
76d0: 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65  an be used.  The
76e0: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
76f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7700: 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e  table (the "Y").
7710: 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20    This.** value 
7720: 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70  can be NULL if p
7730: 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20  DbToken is also 
7740: 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65  NULL.  If pTable
7750: 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74  Token is NULL it
7760: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
7770: 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e  he form of the n
7780: 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61  ame is Z and tha
7790: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  t columns from a
77a0: 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20  ny table.** can 
77b0: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
77c0: 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f  f the name canno
77d0: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e  t be resolved un
77e0: 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61  ambiguously, lea
77f0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7800: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
7810: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
7820: 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65  zero.  Return ze
7830: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  ro on success..*
7840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f  /.static int loo
7850: 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  kupName(.  Parse
7860: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7870: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
7880: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
7890: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
78a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
78b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
78c0: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
78d0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
78e0: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
78f0: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
7900: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
7910: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7920: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
7930: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
7940: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
7950: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
7960: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
7970: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
7980: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
7990: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
79a0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
79b0: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
79c0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
79d0: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
79e0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
79f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
7a00: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7a10: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
7a20: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
7a30: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
7a40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7a50: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
7a60: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
7a70: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
7a80: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
7a90: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
7aa0: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
7ab0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
7ac0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7ad0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
7ae0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
7af0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
7b00: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
7b10: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
7b20: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
7b30: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
7b40: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
7b50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7b60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
7b70: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
7b80: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7b90: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
7ba0: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
7bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
7bc0: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
7bd0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7be0: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
7bf0: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
7c00: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
7c10: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
7c20: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
7c30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
7c40: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
7c50: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63  the list */.  Sc
7c60: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
7c70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7c80: 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65  /* Schema of the
7c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a   expression */..
7ca0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
7cb0: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
7cc0: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
7cd0: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
7ce0: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
7cf0: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
7d00: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7d10: 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  , pDbToken);.  z
7d20: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
7d30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7d40: 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a  TableToken);.  z
7d50: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Col = sqlite3Nam
7d60: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7d70: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ColumnToken);.  
7d80: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7d90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
7da0: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
7db0: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
7dc0: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
7dd0: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
7de0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
7df0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
7e00: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
7e10: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
7e20: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
7e30: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
7e40: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
7e50: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
7e60: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
7e70: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
7e80: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
7e90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
7ea0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
7eb0: 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20  *pCol;.  .      
7ec0: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
7ed0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
7ee0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
7ef0: 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73  .        iDb = s
7f00: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
7f10: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
7f20: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7f30: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
7f40: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
7f50: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
7f60: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
7f70: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
7f80: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
7f90: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
7fa0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
7fb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
7fc0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
7fd0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
7fe0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
7ff0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8000: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
8010: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8020: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8030: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
8040: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
8050: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
8060: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8070: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
8080: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
8090: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
80a0: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
80b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
80c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
80d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
80e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
80f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
8100: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
8110: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
8120: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
8130: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
8140: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62    pSchema = pTab
8150: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
8160: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
8170: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
8180: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
8190: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
81a0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
81b0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
81c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
81d0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
81e0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
81f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
8200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8210: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
8220: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
8230: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69      IdList *pUsi
8240: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
8250: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
8260: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
8270: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
8280: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
8290: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
82a0: 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65             pSche
82b0: 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65  ma = pTab->pSche
82c0: 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma;.            
82d0: 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68  /* Substitute th
82e0: 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20  e rowid (column 
82f0: 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45  -1) for the INTE
8300: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8310: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
8320: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
8330: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
8340: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
8350: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
8360: 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nity = pTab->aCo
8370: 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  l[j].affinity;. 
8380: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
8390: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
83a0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30  P_ExpCollate)==0
83b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
83c0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
83d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
83e0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
83f0: 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20   zColl,-1, 0);. 
8400: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8410: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70           if( i<p
8420: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20  SrcList->nSrc-1 
8430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8440: 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f   if( pItem[1].jo
8450: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
8460: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAL ){.         
8470: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
8480: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64  s match occurred
8490: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
84a0: 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20  le of a natural 
84b0: 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  join,.          
84c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b        ** then sk
84d0: 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62  ip the right tab
84e0: 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75  le to avoid a du
84f0: 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f  plicate match */
8500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8510: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
8520: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
8540: 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d  se if( (pUsing =
8550: 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67   pItem[1].pUsing
8560: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
8570: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8580: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
8590: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
85a0: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
85b0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
85c0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
85d0: 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73  join, skip the s
85e0: 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67  earch of the rig
85f0: 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
8600: 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  join.           
8610: 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
8620: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
8630: 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ch there. */.   
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
8650: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
8660: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
8670: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
8680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8690: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
86a0: 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61  trICmp(pUsing->a
86b0: 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [k].zName, zCol)
86c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
86d0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
86e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
86f0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8750: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8760: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8770: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8780: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8790: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
87a0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
87b0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
87c0: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
87d0: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
87e0: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
87f0: 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e   ** it is a new.
8800: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67  * or old.* trigg
8810: 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  er argument refe
8820: 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20  rence.    */.   
8830: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
8840: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
8850: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
8860: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
8870: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
8880: 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20  pTriggerStack = 
8890: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
88a0: 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  k;.      Table *
88b0: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
88c0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
88d0: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
88e0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
88f0: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
8900: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
8910: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
8920: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
8930: 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  wIdx;.        as
8940: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
8950: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
8960: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
8970: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
8980: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8990: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
89a0: 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20  oldIdx != -1 && 
89b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
89c0: 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29  old", zTab)==0 )
89d0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
89e0: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
89f0: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b  erStack->oldIdx;
8a00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8a10: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8a20: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
8a30: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
8a40: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
8a50: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
8a60: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20  Tab ){ .        
8a70: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
8a80: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
8a90: 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20   pTab->aCol;..  
8aa0: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
8ab0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8ac0: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
8ad0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
8ae0: 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62  l=0; iCol < pTab
8af0: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20  ->nCol; iCol++, 
8b00: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
8b10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8b20: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
8b30: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
8b50: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8b60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8b70: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
8b80: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8b90: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8ba0: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54  olumn = iCol==pT
8bb0: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
8bc0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   iCol;.         
8bd0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
8be0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
8bf0: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  iCol].affinity;.
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8c10: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8c20: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8c30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8c40: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8c50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8c60: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8c70: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8c90: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8ca0: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
8cb0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8cc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8cd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8ce0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
8cf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8d00: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
8d10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
8d20: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
8d30: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
8d40: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
8d50: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
8d60: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
8d70: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
8d80: 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zCol) ){.      
8d90: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
8da0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
8db0: 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  -1;.      pExpr-
8dc0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
8dd0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
8de0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
8df0: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
8e00: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
8e10: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
8e20: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
8e30: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
8e40: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
8e50: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
8e60: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
8e70: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
8e80: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
8e90: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
8ea0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
8eb0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
8ec0: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
8ed0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
8ee0: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
8ef0: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
8f00: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
8f10: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
8f20: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
8f30: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
8f40: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
8f50: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
8f60: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
8f70: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
8f80: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
8f90: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
8fa0: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
8fb0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
8fc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
8fd0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
8fe0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
8ff0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
9000: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
9010: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
9020: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
9030: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
9040: 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74  nt==0 && (pEList
9050: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21   = pNC->pEList)!
9060: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
9070: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9080: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
9090: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
90a0: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
90b0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
90c0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
90d0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
90e0: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
90f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
9100: 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69  xpr *pDup, *pOri
9110: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  g;.          ass
9120: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
9130: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
9140: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
9160: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
9170: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9180: 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  t( pExpr->pSelec
9190: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
91a0: 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74    pOrig = pEList
91b0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[j].pExpr;.  
91c0: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 43          if( !pNC
91d0: 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78  ->allowAgg && Ex
91e0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
91f0: 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  rig, EP_Agg) ){.
9200: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9220: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
9230: 6c 69 61 73 65 64 20 61 67 67 72 65 67 61 74 65  liased aggregate
9240: 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20   %s", zAs);.    
9250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9260: 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  free(zCol);.    
9270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
9280: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9290: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
92a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
92b0: 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20  , pOrig);.      
92c0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
92d0: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
92e0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
92f0: 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20      pDup->pColl 
9300: 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
9310: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70              pDup
9320: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
9330: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
9340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9350: 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  if( pExpr->span.
9360: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
9370: 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  ee((char*)pExpr-
9380: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  >span.z);.      
9390: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
93a0: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
93b0: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
93c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  Expr->token.z);.
93d0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
93e0: 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69  (pExpr, pDup, si
93f0: 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20  zeof(*pExpr));. 
9400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9410: 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20  _free(pDup);.   
9420: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
9430: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
9440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9450: 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20  assert( zTab==0 
9460: 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20  && zDb==0 );.   
9470: 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b         goto look
9480: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20  upname_end_2;.  
9490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
94a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
94b0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
94c0: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  xt name context.
94d0: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20    The loop will 
94e0: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72  exit when either
94f0: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20  .    ** we have 
9500: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20  a match (cnt>0) 
9510: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f  or when we run o
9520: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65  ut of name conte
9530: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xts..    */.    
9540: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
9550: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
9560: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9570: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
9580: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
9590: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
95a0: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
95b0: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
95c0: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
95d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
95e0: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
95f0: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
9600: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
9610: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
9620: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
9630: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
9640: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
9650: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
9660: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
9670: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
9680: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
9690: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
96a0: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
96b0: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
96c0: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
96d0: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
96e0: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
96f0: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
9700: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
9710: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
9720: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
9730: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b  pColumnToken->z[
9740: 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73  0]=='"' ){.    s
9750: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9760: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9770: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9780: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
9790: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
97a0: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
97b0: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
97c0: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
97d0: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
97e0: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
97f0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
9800: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
9810: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
9820: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
9830: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
9840: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
9850: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
9860: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
9870: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
9880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
9890: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
98a0: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
98b0: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
98c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
98d0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
98e0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
98f0: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
9900: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
9910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
9920: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75 70   = sqlite3StrDup
9930: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zCol);.    }.  
9940: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
9950: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9960: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
9970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9980: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
9990: 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a  pTopNC->nErr++;.
99a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
99b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
99c0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
99d0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
99e0: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
99f0: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
9a00: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
9a10: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
9a20: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
9a30: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
9a40: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
9a50: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
9a60: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
9a70: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
9a80: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
9a90: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
9aa0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
9ab0: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
9ac0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9ad0: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
9ae0: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
9af0: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
9b00: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
9b10: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
9b20: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
9b30: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
9b40: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
9b50: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
9b60: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
9b70: 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  Bitmask)*8 ){.  
9b80: 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42      n = sizeof(B
9b90: 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20  itmask)*8-1;.   
9ba0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
9bb0: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
9bc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
9bd0: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
9be0: 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73  Used |= ((Bitmas
9bf0: 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f  k)1)<<n;.  }..lo
9c00: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20  okupname_end:.  
9c10: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  /* Clean up and 
9c20: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
9c30: 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b  lite3_free(zDb);
9c40: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9c50: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  zTab);.  sqlite3
9c60: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
9c70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70  ->pLeft);.  pExp
9c80: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
9c90: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9ca0: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
9cb0: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
9cc0: 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e  t = 0;.  pExpr->
9cd0: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
9ce0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32  lookupname_end_2
9cf0: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
9d00: 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e  (zCol);.  if( cn
9d10: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
9d20: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
9d30: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
9d40: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
9d50: 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70   pSchema, pNC->p
9d60: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  SrcList);.    if
9d70: 28 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61  ( pMatch && !pMa
9d80: 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tch->pSelect ){.
9d90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
9da0: 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62  b = pMatch->pTab
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
9dc0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65  ncrement the nRe
9dd0: 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e  f value on all n
9de0: 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f  ame contexts fro
9df0: 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20  m TopNC up to.  
9e00: 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77    ** the point w
9e10: 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61  here the name ma
9e20: 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f  tched. */.    fo
9e30: 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73  r(;;){.      ass
9e40: 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29  ert( pTopNC!=0 )
9e50: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e  ;.      pTopNC->
9e60: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nRef++;.      if
9e70: 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20  ( pTopNC==pNC ) 
9e80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f  break;.      pTo
9e90: 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e  pNC = pTopNC->pN
9ea0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ext;.    }.    r
9eb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73  eturn 0;.  } els
9ec0: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e {.    return 1
9ed0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
9ee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
9ef0: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
9f00: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
9f10: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  Tree()..**.** Re
9f20: 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e  solve symbolic n
9f30: 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c  ames into TK_COL
9f40: 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  UMN operators fo
9f50: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
9f60: 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70   node in the exp
9f70: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
9f80: 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69  eturn 0 to conti
9f90: 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64  nue the search d
9fa0: 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  own.** the tree 
9fb0: 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68  or 2 to abort th
9fc0: 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a  e tree walk..**.
9fd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9fe0: 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20  also does error 
9ff0: 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d  checking and nam
a000: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72  e resolution for
a010: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  .** function nam
a020: 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f  es.  The operato
a030: 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  r for aggregate 
a040: 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61  functions is cha
a050: 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47  nged.** to TK_AG
a060: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73  G_FUNCTION..*/.s
a070: 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65  tatic int nameRe
a080: 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20  solverStep(void 
a090: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
a0a0: 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  pr){.  NameConte
a0b0: 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43  xt *pNC = (NameC
a0c0: 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20  ontext*)pArg;.  
a0d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a  Parse *pParse;..
a0e0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
a0f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73   return 1;.  ass
a100: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
a110: 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70   pParse = pNC->p
a120: 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78  Parse;..  if( Ex
a130: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
a140: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
a150: 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b  ved) ) return 1;
a160: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
a170: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
a180: 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20  olved);.#ifndef 
a190: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43  NDEBUG.  if( pNC
a1a0: 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e  ->pSrcList && pN
a1b0: 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c  C->pSrcList->nAl
a1c0: 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63  loc>0 ){.    Src
a1d0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
a1e0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
a1f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
a200: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70  or(i=0; i<pNC->p
a210: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
a220: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
a230: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
a240: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
a250: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
a260: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
a270: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
a280: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
a290: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
a2a0: 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74    /* Double-quot
a2b0: 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ed strings (ex: 
a2c0: 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20  "abc") are used 
a2d0: 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  as identifiers i
a2e0: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  f.    ** possibl
a2f0: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
a300: 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72  ey remain as str
a310: 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75  ings.  Single-qu
a320: 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69  oted.    ** stri
a330: 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20  ngs (ex: 'abc') 
a340: 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e  are always strin
a350: 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20  g literals..    
a360: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  */.    case TK_S
a370: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
a380: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
a390: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65  z[0]=='\'' ) bre
a3a0: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  ak;.      /* Fal
a3b0: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
a3c0: 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68  TK_ID case if th
a3d0: 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71  is is a double-q
a3e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  uoted string */.
a3f0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c      }.    /* A l
a400: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69  one identifier i
a410: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
a420: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
a430: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
a440: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
a450: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  e(pParse, 0, 0, 
a460: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70  &pExpr->token, p
a470: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
a480: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a490: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61  }.  .    /* A ta
a4a0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ble name and col
a4b0: 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44  umn name:     ID
a4c0: 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20  .ID.    ** Or a 
a4d0: 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20  database, table 
a4e0: 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e  and column:  ID.
a4f0: 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20  ID.ID.    */.   
a500: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a   case TK_DOT: {.
a510: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f        Token *pCo
a520: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65  lumn;.      Toke
a530: 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  n *pTable;.     
a540: 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20   Token *pDb;.   
a550: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b     Expr *pRight;
a560: 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70  ..      /* if( p
a570: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65  SrcList==0 ) bre
a580: 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69  ak; */.      pRi
a590: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
a5a0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
a5b0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
a5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20   ){.        pDb 
a5d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
a5e0: 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  ble = &pExpr->pL
a5f0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
a600: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
a610: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
a620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a630: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
a640: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
a650: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26  .        pDb = &
a660: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
a670: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ken;.        pTa
a680: 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  ble = &pRight->p
a690: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
a6a0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
a6b0: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
a6c0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  token;.      }. 
a6d0: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
a6e0: 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61  pParse, pDb, pTa
a6f0: 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e  ble, pColumn, pN
a700: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
a710: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
a720: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
a730: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a   function names.
a740: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a750: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
a760: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
a770: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
a780: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
a790: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20  Expr->pList;    
a7a0: 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  /* The argument 
a7b0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
a7c0: 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  t n = pList ? pL
a7d0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
a7e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a7f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
a800: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
a810: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
a820: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
a830: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
a840: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
a850: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
a860: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a870: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
a880: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
a890: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
a8a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
a8b0: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
a8c0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
a8d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
a8e0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74  i;.      int aut
a8f0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
a900: 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a       /* Authoriz
a910: 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65  ation to use the
a920: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
a930: 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
a960: 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69  acters in functi
a970: 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
a980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
a990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a9a0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
a9b0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  e. */.      Func
a9c0: 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
a9d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
a9e0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
a9f0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
aa00: 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43     int enc = ENC
aa10: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f  (pParse->db);  /
aa20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65  * The database e
aa30: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  ncoding */..    
aa40: 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70    zId = (char*)p
aa50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
aa60: 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72       nId = pExpr
aa70: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
aa80: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
aa90: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
aaa0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
aab0: 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  , n, enc, 0);.  
aac0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
aad0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
aae0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
aaf0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
ab00: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20  , zId, nId, -1, 
ab10: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
ab20: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
ab30: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
ab40: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
ab50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ab60: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
ab70: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
ab80: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ab90: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
aba0: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
abb0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
abc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
abd0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20  HORIZATION.     
abe0: 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20   if( pDef ){.   
abf0: 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69       auth = sqli
ac00: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ac10: 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  rse, SQLITE_FUNC
ac20: 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a  TION, 0, pDef->z
ac30: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
ac40: 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49    if( auth!=SQLI
ac50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ac60: 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c     if( auth==SQL
ac70: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
ac80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ac90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
aca0: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20  "not authorized 
acb0: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a  to use function:
acc0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
acf0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
ad00: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
ad10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ad20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
ad30: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
ad40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ad50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ad60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
ad70: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e  f( is_agg && !pN
ad80: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  C->allowAgg ){. 
ad90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ada0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
adb0: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
adc0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
add0: 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a  s()", nId,zId);.
ade0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
adf0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
ae00: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
ae10: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
ae20: 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  _func ){.       
ae30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ae40: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
ae50: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  h function: %.*s
ae60: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
ae70: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
ae80: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
ae90: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  f( wrong_num_arg
aea0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
aeb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
aec0: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
aed0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
aee0: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
aef0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
af00: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
af10: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
af20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
af30: 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20  f( is_agg ){.   
af40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
af50: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
af60: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68  ;.        pNC->h
af70: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  asAgg = 1;.     
af80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
af90: 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77  agg ) pNC->allow
afa0: 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Agg = 0;.      f
afb0: 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72  or(i=0; pNC->nEr
afc0: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
afd0: 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45  ){.        walkE
afe0: 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61  xprTree(pList->a
aff0: 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52  [i].pExpr, nameR
b000: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
b010: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b020: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e   if( is_agg ) pN
b030: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  C->allowAgg = 1;
b040: 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45  .      /* FIX ME
b050: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72  :  Compute pExpr
b060: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64  ->affinity based
b070: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64   on the expected
b080: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a   return.      **
b090: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
b0a0: 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a  ction .      */.
b0b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f        return is_
b0c0: 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  agg;.    }.#ifnd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b0e0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
b0f0: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
b100: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
b110: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b120: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
b130: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
b140: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
b150: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65   nRef = pNC->nRe
b160: 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f;.#ifndef SQLIT
b170: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20  E_OMIT_CHECK.   
b180: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
b190: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
b1a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b1b0: 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71 75  sg(pParse,"subqu
b1c0: 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64  eries prohibited
b1d0: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
b1e0: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  aints");.       
b1f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
b200: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52    sqlite3SelectR
b210: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
b220: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Expr->pSelect, p
b230: 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  NC);.        ass
b240: 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d  ert( pNC->nRef>=
b250: 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20  nRef );.        
b260: 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e  if( nRef!=pNC->n
b270: 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Ref ){.         
b280: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
b290: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
b2a0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
b2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b2c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
b2d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b2e0: 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54  CHECK.    case T
b2f0: 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
b300: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43      if( pNC->isC
b310: 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  heck ){.        
b320: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b330: 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65  pParse,"paramete
b340: 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  rs prohibited in
b350: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
b360: 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ts");.      }.  
b370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b380: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
b390: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
b3a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
b3b0: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
b3c0: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
b3d0: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
b3e0: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
b3f0: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
b400: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
b410: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
b420: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
b430: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
b440: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
b450: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
b460: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
b470: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
b480: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
b490: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
b4a0: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
b4b0: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
b4c0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
b4d0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
b4e0: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
b4f0: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
b500: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
b510: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
b520: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
b530: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
b540: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
b550: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
b560: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
b570: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
b580: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
b590: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
b5a0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
b5b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
b5c0: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
b5d0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
b5e0: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
b5f0: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
b600: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
b610: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
b620: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
b630: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
b640: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
b650: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
b660: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ROWID..**.** Als
b670: 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  o resolve functi
b680: 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65  on names and che
b690: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
b6a0: 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75   for proper.** u
b6b0: 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  sage.  Make sure
b6c0: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61   all function na
b6d0: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
b6e0: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
b6f0: 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65  ions.** have the
b700: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
b710: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
b720: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
b730: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
b740: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61  se->zErrMsg if a
b750: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
b760: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
b770: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
b780: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
b790: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
b7a0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b7b0: 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68  ions then set th
b7c0: 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70  e EP_Agg.** prop
b7d0: 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72  erty on the expr
b7e0: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ession..*/.int s
b7f0: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
b800: 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  eNames( .  NameC
b810: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
b820: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
b830: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
b840: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
b850: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
b860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
b870: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
b880: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
b890: 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67    int savedHasAg
b8a0: 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  g;.  if( pExpr==
b8b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69  0 ) return 0;.#i
b8c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b8d0: 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45  _TEST) || SQLITE
b8e0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
b8f0: 30 0a 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e  0.  if( (pExpr->
b900: 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61  nHeight+pNC->pPa
b910: 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 53 51  rse->nHeight)>SQ
b920: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
b930: 50 54 48 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  PTH ){.    sqlit
b940: 65 33 45 72 72 6f 72 4d 73 67 28 70 4e 43 2d 3e  e3ErrorMsg(pNC->
b950: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
b960: 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65  "Expression tree
b970: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d   is too large (m
b980: 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29  aximum depth %d)
b990: 22 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",.       SQLITE
b9a0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 0a  _MAX_EXPR_DEPTH.
b9b0: 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72      );.    retur
b9c0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e  n 1;.  }.  pNC->
b9d0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
b9e0: 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  += pExpr->nHeigh
b9f0: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65  t;.#endif.  save
ba00: 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68  dHasAgg = pNC->h
ba10: 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61  asAgg;.  pNC->ha
ba20: 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b  sAgg = 0;.  walk
ba30: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
ba40: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
ba50: 2c 20 70 4e 43 29 3b 0a 23 69 66 20 64 65 66 69  , pNC);.#if defi
ba60: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
ba70: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   || SQLITE_MAX_E
ba80: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e  XPR_DEPTH>0.  pN
ba90: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
baa0: 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht -= pExpr->nHe
bab0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ight;.#endif.  i
bac0: 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29  f( pNC->nErr>0 )
bad0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
bae0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
baf0: 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Error);.  }.  if
bb00: 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b  ( pNC->hasAgg ){
bb10: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
bb20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41  erty(pExpr, EP_A
bb30: 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  gg);.  }else if(
bb40: 20 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a   savedHasAgg ){.
bb50: 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20      pNC->hasAgg 
bb60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
bb70: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
bb80: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
bb90: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
bba0: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
bbb0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
bbc0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
bbd0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
bbe0: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
bbf0: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
bc00: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
bc10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
bc20: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
bc30: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
bc40: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
bc50: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
bc60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
bc70: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
bc80: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
bc90: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
bca0: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
bcb0: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
bcc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
bcd0: 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65  EST.  int sqlite
bce0: 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20  3_enable_in_opt 
bcf0: 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 23 64 65  = 1;.#else.  #de
bd00: 66 69 6e 65 20 73 71 6c 69 74 65 33 5f 65 6e 61  fine sqlite3_ena
bd10: 62 6c 65 5f 69 6e 5f 6f 70 74 20 31 0a 23 65 6e  ble_in_opt 1.#en
bd20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
bd30: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
bd40: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
bd50: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
bd60: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
bd70: 0a 2a 2a 20 49 74 27 73 20 6a 6f 62 20 69 73 20  .** It's job is 
bd80: 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  to find or creat
bd90: 65 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63  e a b-tree struc
bda0: 74 75 72 65 20 74 68 61 74 20 6d 61 79 20 62 65  ture that may be
bdb0: 20 75 73 65 64 0a 2a 2a 20 65 69 74 68 65 72 20   used.** either 
bdc0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
bdd0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 28 2e  ership of the (.
bde0: 2e 2e 29 20 73 65 74 20 6f 72 20 74 6f 20 69 74  ..) set or to it
bdf0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
be00: 20 69 74 27 73 20 6d 65 6d 62 65 72 73 2c 20 73   it's members, s
be10: 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74  kipping duplicat
be20: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  es..**.** The cu
be30: 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 74  rsor opened on t
be40: 68 65 20 73 74 72 75 63 74 75 72 65 20 28 64 61  he structure (da
be50: 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 64 61  tabase table, da
be60: 74 61 62 61 73 65 20 69 6e 64 65 78 20 0a 2a 2a  tabase index .**
be70: 20 6f 72 20 65 70 68 65 72 6d 61 6c 20 74 61 62   or ephermal tab
be80: 6c 65 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  le) is stored in
be90: 20 70 58 2d 3e 69 54 61 62 6c 65 20 62 65 66 6f   pX->iTable befo
bea0: 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
beb0: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20 54 68 65   returns..** The
bec0: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
bed0: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 73 74  indicates the st
bee0: 72 75 63 74 75 72 65 20 74 79 70 65 2c 20 61 73  ructure type, as
bef0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bf00: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
bf10: 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61   - The cursor wa
bf20: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61  s opened on a da
bf30: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
bf40: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
bf50: 58 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  X - The cursor w
bf60: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
bf70: 61 74 61 62 61 73 65 20 69 6e 64 65 63 2e 0a 2a  atabase indec..*
bf80: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
bf90: 20 2d 20 20 20 54 68 65 20 63 75 72 73 6f 72 20   -   The cursor 
bfa0: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
bfb0: 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61 74 65  specially create
bfc0: 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  d and.**        
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75              popu
bfe0: 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20  lated epheremal 
bff0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  table..**.** An 
c000: 65 78 69 73 74 69 6e 67 20 73 74 72 75 63 74 75  existing structu
c010: 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  re may only be u
c020: 73 65 64 20 69 66 20 74 68 65 20 53 45 4c 45 43  sed if the SELEC
c030: 54 20 69 73 20 6f 66 20 74 68 65 20 73 69 6d 70  T is of the simp
c040: 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  le.** form:.**.*
c050: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
c060: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
c070: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e>.**.** If the 
c080: 6d 75 73 74 42 65 55 6e 69 71 75 65 20 70 61 72  mustBeUnique par
c090: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c  ameter is false,
c0a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 77   the structure w
c0b0: 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  ill be used .** 
c0c0: 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65 6d  for fast set mem
c0d0: 62 65 72 73 68 69 70 20 74 65 73 74 73 2e 20 49  bership tests. I
c0e0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 20 65  n this case an e
c0f0: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
c100: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
c110: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
c120: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
c130: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
c140: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
c150: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
c160: 75 6d 6e 3e 20 61 73 20 69 74 27 73 20 6c 65 66  umn> as it's lef
c170: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  t-most column..*
c180: 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65 55 6e  *.** If mustBeUn
c190: 69 71 75 65 20 69 73 20 74 72 75 65 2c 20 74 68  ique is true, th
c1a0: 65 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  en the structure
c1b0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
c1c0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
c1d0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
c1e0: 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20 61 6e  ers, skipping an
c1f0: 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20 49 6e  y duplicates. In
c200: 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a 2a 2a   this case an.**
c210: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
c220: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
c230: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
c240: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
c250: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
c260: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
c270: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
c280: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
c290: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
c2a0: 69 73 20 75 6e 69 71 75 65 20 62 79 20 76 69 72  is unique by vir
c2b0: 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  tue of a constra
c2c0: 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69 74 20  int or implicit 
c2d0: 69 6e 64 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  index..*/.int sq
c2e0: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
c2f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c300: 45 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75  Expr *pX, int mu
c310: 73 74 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53  stBeUnique){.  S
c320: 65 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20  elect *p;.  int 
c330: 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  eType = 0;.  int
c340: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
c350: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  nTab++;..  /* Th
c360: 65 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e  e follwing if(..
c370: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  .) expression is
c380: 20 74 72 75 65 20 69 66 20 74 68 65 20 53 45 4c   true if the SEL
c390: 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20  ECT is of the . 
c3a0: 20 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a   ** simple form:
c3b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
c3c0: 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46  ELECT <column> F
c3d0: 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a  ROM <table>.  **
c3e0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
c3f0: 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61   the case, it ma
c400: 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
c410: 20 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67   use an existing
c420: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69   table.  ** or i
c430: 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
c440: 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70  generating an ep
c450: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20  heremal table.. 
c460: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
c470: 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a  3_enable_in_opt.
c480: 20 20 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65     && (p=pX->pSe
c490: 6c 65 63 74 29 20 26 26 20 21 70 2d 3e 70 50 72  lect) && !p->pPr
c4a0: 69 6f 72 0a 20 20 20 26 26 20 21 70 2d 3e 69 73  ior.   && !p->is
c4b0: 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
c4c0: 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72  isAgg && !p->pGr
c4d0: 6f 75 70 42 79 0a 20 20 20 26 26 20 70 2d 3e 70  oupBy.   && p->p
c4e0: 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
c4f0: 6e 53 72 63 3d 3d 31 20 26 26 20 21 70 2d 3e 70  nSrc==1 && !p->p
c500: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
c510: 74 0a 20 20 20 26 26 20 21 70 2d 3e 70 53 72 63  t.   && !p->pSrc
c520: 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 70 53 65  ->a[0].pTab->pSe
c530: 6c 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  lect            
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 20 0a 20 20 20 26 26 20 70 2d 3e        .   && p->
c560: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
c570: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61   && p->pEList->a
c580: 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
c590: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21  K_COLUMN.   && !
c5a0: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
c5b0: 3e 70 4f 66 66 73 65 74 20 26 26 20 21 70 2d 3e  >pOffset && !p->
c5c0: 70 57 68 65 72 65 0a 20 20 29 7b 0a 20 20 20 20  pWhere.  ){.    
c5d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c5e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 49 6e  arse->db;.    In
c5f0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 45  dex *pIdx;.    E
c600: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e  xpr *pExpr = p->
c610: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c620: 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  pr;.    int iCol
c630: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c640: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  n;.    Vdbe *v =
c650: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c660: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a  pParse);..    /*
c670: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
c680: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
c690: 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49  om two places. I
c6a0: 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
c6b0: 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73   vdbe.    ** has
c6c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
c6d0: 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75  located. So assu
c6e0: 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  me sqlite3GetVdb
c6f0: 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e() is always.  
c700: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
c710: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
c720: 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20   assert(v);.    
c730: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c740: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
c750: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
c760: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a       int iAddr;.
c770: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
c780: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
c790: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e  ].pTab;.      in
c7a0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
c7b0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
c7c0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c7e0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
c7f0: 44 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Db);..      sqli
c800: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c810: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 4d 65 6d  OP_MemLoad, iMem
c820: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 41 64 64  , 0);.      iAdd
c830: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c840: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30  ddOp(v, OP_If, 0
c850: 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
c860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c870: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
c880: 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 20 20 73   iMem);..      s
c890: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
c8a0: 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
c8b0: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
c8c0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
c8d0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
c8e0: 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
c8f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c900: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
c910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
c920: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
c930: 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74 68  uence used by th
c940: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66  e comparison. If
c950: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f 20   an index is to 
c960: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
c970: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
c980: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
c990: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
c9a0: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
c9b0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
c9c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 20 20  ion sequence..  
c9d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c      */.      Col
c9e0: 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c  lSeq *pReq = sql
c9f0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
ca00: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
ca10: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70   pX->pLeft, pExp
ca20: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  r);..      /* Ch
ca30: 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66  eck that the aff
ca40: 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20  inity that will 
ca50: 62 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f  be used to perfo
ca60: 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  rm the .      **
ca70: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
ca80: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
ca90: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63  ffinity of the c
caa0: 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20  olumn. If.      
cab0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  ** it is not, it
cac0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
cad0: 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65   to use any inde
cae0: 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  x..      */.    
caf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cb00: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
cb10: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61  ab;.      char a
cb20: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
cb30: 66 66 69 6e 69 74 79 28 70 58 29 3b 0a 20 20 20  ffinity(pX);.   
cb40: 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f     int affinity_
cb50: 6f 6b 20 3d 20 28 70 54 61 62 2d 3e 61 43 6f 6c  ok = (pTab->aCol
cb60: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3d  [iCol].affinity=
cb70: 3d 61 66 66 7c 7c 61 66 66 3d 3d 53 51 4c 49 54  =aff||aff==SQLIT
cb80: 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 0a 20 20  E_AFF_NONE);..  
cb90: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
cba0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
cbb0: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
cbc0: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
cbd0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
cbe0: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
cbf0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
cc00: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
cc10: 20 28 70 52 65 71 3d 3d 73 71 6c 69 74 65 33 46   (pReq==sqlite3F
cc20: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
cc30: 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a  NC(db), pIdx->az
cc40: 43 6f 6c 6c 5b 30 5d 2c 20 2d 31 2c 20 30 29 29  Coll[0], -1, 0))
cc50: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d  .         && (!m
cc60: 75 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28  ustBeUnique || (
cc70: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
cc80: 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f   && pIdx->onErro
cc90: 72 21 3d 4f 45 5f 4e 6f 6e 65 29 29 0a 20 20 20  r!=OE_None)).   
cca0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
ccb0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
ccc0: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
ccd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
cce0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
ccf0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ddr;.          c
cd00: 68 61 72 20 2a 70 4b 65 79 3b 0a 20 20 0a 20 20  har *pKey;.  .  
cd10: 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20 28          pKey = (
cd20: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 49 6e  char *)sqlite3In
cd30: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
cd40: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
cd50: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
cd60: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
cd70: 62 2c 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  b, pIdx->pSchema
cd80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
cd90: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
cda0: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
cdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cdc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
cdd0: 4c 6f 61 64 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  Load, iMem, 0);.
cde0: 20 20 20 20 20 20 20 20 20 20 69 41 64 64 72 20            iAddr 
cdf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ce00: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  Op(v, OP_If, 0, 
ce10: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  iMem);.         
ce20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce30: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
ce40: 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20 20 20  1, iMem);.  .   
ce50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
ce70: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
ce80: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
ce90: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73 22  mment((v, "# %s"
cea0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
ceb0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cec0: 65 33 56 64 62 65 4f 70 33 28 76 2c 4f 50 5f 4f  e3VdbeOp3(v,OP_O
ced0: 70 65 6e 52 65 61 64 2c 69 54 61 62 2c 70 49 64  penRead,iTab,pId
cee0: 78 2d 3e 74 6e 75 6d 2c 70 4b 65 79 2c 50 33 5f  x->tnum,pKey,P3_
cef0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
cf00: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
cf10: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
cf20: 45 58 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  EX;.          sq
cf30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cf40: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
cf50: 6e 73 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e  ns, iTab, pIdx->
cf60: 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20 20  nColumn);..     
cf70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf80: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
cf90: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
cfa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cfb0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
cfc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
cfd0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
cfe0: 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 65 54 79  se, pX);.    eTy
cff0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50  pe = IN_INDEX_EP
d000: 48 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  H;.  }else{.    
d010: 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pX->iTable = iTa
d020: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
d030: 65 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eType;.}../*.** 
d040: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
d050: 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72  r scalar subquer
d060: 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65  ies used as an e
d070: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64  xpression.** and
d080: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20   IN operators.  
d090: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
d0a0: 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52      (SELECT a FR
d0b0: 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d  OM b)          -
d0c0: 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20  - subquery.**   
d0d0: 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54    EXISTS (SELECT
d0e0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20   a FROM b)   -- 
d0f0: 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a  EXISTS subquery.
d100: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35  **     x IN (4,5
d110: 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20  ,11)            
d120: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
d130: 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69   with list on ri
d140: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a  ght-hand side.**
d150: 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43       x IN (SELEC
d160: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20  T a FROM b)     
d170: 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  -- IN operator w
d180: 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20  ith subquery on 
d190: 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20  the right.**.** 
d1a0: 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65  The pExpr parame
d1b0: 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68  ter describes th
d1c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
d1d0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49  t contains the I
d1e0: 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72  N.** operator or
d1f0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69   subquery..*/.#i
d200: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d210: 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20  T_SUBQUERY.void 
d220: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
d230: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
d240: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
d250: 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72  {.  int testAddr
d260: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d280: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
d290: 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ress */.  Vdbe *
d2a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
d2b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
d2c0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
d2d0: 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ...  /* This cod
d2e0: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
d2f0: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
d300: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
d310: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
d320: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
d330: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
d340: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
d350: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
d360: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
d370: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
d380: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
d390: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
d3a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
d3b0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
d3c0: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
d3d0: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
d3e0: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
d3f0: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
d400: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
d410: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
d420: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
d430: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
d440: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
d450: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
d460: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
d470: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
d480: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
d490: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
d4a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
d4b0: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
d4c0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
d4d0: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70  .    int mem = p
d4e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
d4f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d500: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
d510: 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  d, mem, 0);.    
d520: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
d530: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d540: 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_If, 0, 0);.   
d550: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
d560: 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  r>0 || pParse->d
d570: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
d5a0: 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20  mInt, 1, mem);. 
d5b0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
d5c0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
d5d0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
d5e0: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
d5f0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
d600: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
d610: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
d620: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
d630: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
d640: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
d650: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
d660: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
d670: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
d680: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
d690: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
d6a0: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
d6b0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
d6c0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
d6d0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
d6e0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
d6f0: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
d700: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
d710: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
d720: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
d730: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
d740: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
d750: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
d760: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
d770: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
d780: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
d790: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
d7a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
d7b0: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
d7c0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
d7d0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
d7e0: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
d7f0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
d800: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
d810: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
d820: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
d830: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
d840: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
d850: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
d860: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
d870: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
d880: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
d890: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
d8a0: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
d8b0: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
d8c0: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
d8d0: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
d8e0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
d8f0: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
d900: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
d910: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
d920: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
d930: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
d940: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
d950: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
d960: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d970: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
d980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d990: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d9a0: 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
d9b0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65  le, 0);.      me
d9c0: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
d9d0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
d9e0: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
d9f0: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  o.nField = 1;.  
da00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
da20: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d  mColumns, pExpr-
da30: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20  >iTable, 1);..  
da40: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
da50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
da60: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
da70: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
da80: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
da90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
daa0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
dab0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
dac0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
dad0: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
dae0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
daf0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
db00: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
db10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
db20: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70  int iParm = pExp
db30: 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28  r->iTable +  (((
db40: 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31  int)affinity)<<1
db50: 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  6);.        Expr
db60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
db70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
db80: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
db90: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
dba0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
dbb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
dbc0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
dbd0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
dbe0: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
dbf0: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
dc00: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
dc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc20: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
dc30: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
dc40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
dc50: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
dc60: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
dc70: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
dc80: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42  ll[0] = sqlite3B
dc90: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
dca0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
dcb0: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
dcc0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
dcd0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
dce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
dcf0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
dd00: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
dd10: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
dd20: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
dd30: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
dd40: 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
dd50: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
dd60: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
dd70: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
dd80: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
dd90: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
dda0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
ddb0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
ddc0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
ddd0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
dde0: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
ddf0: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
de00: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
de10: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
de20: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
de30: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
de40: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
de50: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
de60: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
de70: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
de80: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
de90: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
dea0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
deb0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ..        if( !a
dec0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
ded0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
dee0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
def0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
df00: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
df10: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  [0] = pExpr->pLe
df20: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  ft->pColl;..    
df30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
df40: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
df50: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
df60: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  >. */.        fo
df70: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
df80: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
df90: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
dfa0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
dfb0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
dfc0: 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
dfd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
dfe0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
dff0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
e000: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
e010: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
e020: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
e030: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
e040: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
e050: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
e060: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
e070: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
e080: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
e090: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
e0a0: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
e0b0: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
e0c0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
e0d0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
e0e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e0f0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 30    if( testAddr>0
e100: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
e110: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
e120: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
e130: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e140: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
e150: 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20  dr-1, 3);.      
e160: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
e170: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
e180: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
e190: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
e1a0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
e1b0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
e1c0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
e1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e1e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
e1f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e200: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e210: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
e220: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
e230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e250: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
e260: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
e270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e280: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e290: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
e2a0: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
e2b0: 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
e2c0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  NFO);.      brea
e2d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
e2e0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
e2f0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
e300: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
e310: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
e320: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
e330: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
e340: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
e350: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
e360: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
e370: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
e380: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
e390: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
e3a0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
e3b0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
e3c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e3d0: 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75  Token one = { (u
e3e0: 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a  8*)"1", 0, 1 };.
e3f0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
e400: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  el;.      int iM
e410: 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f  em;.      int so
e420: 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d  p;..      pExpr-
e430: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20  >iColumn = iMem 
e440: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
e450: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
e460: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
e470: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
e480: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
e490: 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53  .        sop = S
e4a0: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
e4b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e4c0: 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
e4d0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
e4e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e4f0: 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75 65  , "# Init subque
e500: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
e510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e520: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69     sop = SRT_Exi
e530: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
e540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e550: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
e560: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Mem);.        Vd
e570: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
e580: 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73   Init EXISTS res
e590: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
e5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e5b0: 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c  rDelete(pSel->pL
e5c0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
e5d0: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
e5e0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
e5f0: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
e600: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
e610: 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
e620: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
e630: 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c  sop, iMem, 0, 0,
e640: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
e650: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
e660: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e670: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e680: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
e690: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e6a0: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
e6b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b  ;.  }..  return;
e6c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e6d0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e6e0: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c  Y */../*.** Dupl
e6f0: 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20  icate an 8-byte 
e700: 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  value.*/.static 
e710: 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73 28  char *dup8bytes(
e720: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
e730: 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72  har *in){.  char
e740: 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44   *out = sqlite3D
e750: 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74  bMallocRaw(sqlit
e760: 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b  e3VdbeDb(v), 8);
e770: 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
e780: 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e    memcpy(out, in
e790: 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 8);.  }.  retu
e7a0: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
e7b0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
e7c0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
e7d0: 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
e7e0: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
e7f0: 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
e800: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
e810: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
e820: 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
e830: 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
e840: 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
e850: 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
e860: 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
e870: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
e880: 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
e890: 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
e8a0: 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
e8b0: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
e8c0: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
e8d0: 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28  c void codeReal(
e8e0: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
e8f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
e900: 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 29 7b 0a  nt negateFlag){.
e910: 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76    assert( z || v
e920: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64  ==0 || sqlite3Vd
e930: 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46  beDb(v)->mallocF
e940: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
e950: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
e960: 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  alue;.    char *
e970: 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  zV;.    assert( 
e980: 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29  !isdigit(z[n]) )
e990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
e9a0: 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  F(z, &value);.  
e9b0: 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67    if( negateFlag
e9c0: 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75   ) value = -valu
e9d0: 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38  e;.    zV = dup8
e9e0: 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
e9f0: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c  &value);.    sql
ea00: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ea10: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 56  P_Real, 0, 0, zV
ea20: 2c 20 50 33 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P3_REAL);.  }.
ea30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
ea40: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
ea50: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
ea60: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
ea70: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
ea80: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
ea90: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
eaa0: 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c  e z[] string wil
eab0: 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62  l probably not b
eac0: 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  e zero-terminate
ead0: 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20  d.  But the .** 
eae0: 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69  z[n] character i
eaf0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
eb00: 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  be something tha
eb10: 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a  t does not look.
eb20: 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74  ** like the cont
eb30: 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  inuation of the 
eb40: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
eb50: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
eb60: 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  er(Vdbe *v, cons
eb70: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
eb80: 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
eb90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c  ){.  assert( z |
eba0: 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  | v==0 || sqlite
ebb0: 33 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c  3VdbeDb(v)->mall
ebc0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
ebd0: 28 20 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( z ){.    int i
ebe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
ebf0: 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a  sdigit(z[n]) );.
ec00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
ec10: 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29  etInt32(z, &i) )
ec20: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 61  {.      if( nega
ec30: 74 65 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  teFlag ) i = -i;
ec40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ec50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
ec60: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
ec70: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
ec80: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
ec90: 7a 2c 20 6e 65 67 61 74 65 46 6c 61 67 29 20 29  z, negateFlag) )
eca0: 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61 6c 75  {.      i64 valu
ecb0: 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e;.      char *z
ecc0: 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  V;.      sqlite3
ecd0: 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c 75 65  Atoi64(z, &value
ece0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  );.      if( neg
ecf0: 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
ed00: 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20  = -value;.      
ed10: 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76  zV = dup8bytes(v
ed20: 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29  , (char*)&value)
ed30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ed40: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74  dbeOp3(v, OP_Int
ed50: 36 34 2c 20 30 2c 20 30 2c 20 7a 56 2c 20 50 33  64, 0, 0, zV, P3
ed60: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
ed70: 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65  se{.      codeRe
ed80: 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 61  al(v, z, n, nega
ed90: 74 65 46 6c 61 67 29 3b 0a 20 20 20 20 7d 0a 20  teFlag);.    }. 
eda0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
edb0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
edc0: 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
edd0: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
ede0: 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
edf0: 20 70 54 61 62 20 61 6e 64 20 70 75 73 68 20 74   pTab and push t
ee00: 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hat column value
ee10: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
ee20: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 6f  There.** is an o
ee30: 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
ee40: 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20 20 49  ab in iTable.  I
ee50: 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
ee60: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
ee70: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
ee80: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
ee90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
eea0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
eeb0: 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a  Vdbe *v, Table *
eec0: 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 75 6d  pTab, int iColum
eed0: 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  n, int iTable){.
eee0: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
eef0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
ef00: 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75  (pTab && IsVirtu
ef10: 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56  al(pTab)) ? OP_V
ef20: 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64  Rowid : OP_Rowid
ef30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ef40: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54  eAddOp(v, op, iT
ef50: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  able, 0);.  }els
ef60: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
ef70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ef80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
ef90: 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  mn, iTable, iCol
efa0: 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  umn);.  }else{. 
efb0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
efc0: 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
efd0: 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
efe0: 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
eff0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
f000: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
f010: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  n);.    sqlite3C
f020: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
f030: 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  pTab, iColumn);.
f040: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f050: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
f060: 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  NT.    if( pTab-
f070: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
f080: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
f090: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
f0a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0b0: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  Op(v, OP_RealAff
f0c0: 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20  inity, 0, 0);.  
f0d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f0f0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
f100: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
f110: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
f120: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
f130: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
f140: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
f150: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  of stack..**.** 
f160: 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
f170: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
f180: 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
f190: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
f1a0: 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
f1b0: 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
f1c0: 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
f1d0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
f1e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
f1f0: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
f200: 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
f210: 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
f220: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
f230: 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
f240: 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
f250: 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
f260: 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
f270: 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
f280: 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
f290: 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
f2a0: 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
f2b0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
f2c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
f2d0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
f2e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
f2f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f300: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
f310: 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63  t op;.  int stac
f320: 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a  kChng = 1;    /*
f330: 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67   Amount of chang
f340: 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68  e to stack depth
f350: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
f360: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f370: 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
f380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f390: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
f3a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
f3b0: 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72    }.  op = pExpr
f3c0: 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
f3d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
f3e0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
f3f0: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
f400: 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
f410: 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
f420: 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
f430: 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
f440: 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
f450: 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
f460: 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
f470: 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
f480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
f4a0: 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c  oad, pCol->iMem,
f4b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
f4c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
f4d0: 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
f4e0: 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
f4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
f510: 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
f520: 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
f550: 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a  iSorterColumn);.
f560: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
f580: 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
f590: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
f5a0: 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
f5b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f5c0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
f5d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
f5e0: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
f5f0: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
f600: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
f610: 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
f620: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
f630: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
f640: 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20  kOffset>0 );.   
f650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
f670: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
f680: 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t-pExpr->iColumn
f690: 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  -1, 1);.      }e
f6a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
f6b0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
f6c0: 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e  olumn(v, pExpr->
f6d0: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pTab, pExpr->iCo
f6e0: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
f6f0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
f700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
f720: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
f730: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
f740: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
f750: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
f760: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  .n, 0);.      br
f770: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f780: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
f790: 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
f7a0: 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  , (char*)pExpr->
f7b0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
f7c0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
f7d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f7e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
f7f0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
f800: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
f810: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
f820: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f830: 56 64 62 65 4f 70 33 28 76 2c 4f 50 5f 53 74 72  VdbeOp3(v,OP_Str
f840: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 28 63 68 61  ing8, 0, 0, (cha
f850: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
f860: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
f870: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
f880: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f890: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
f8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8b0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
f8c0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
f8d0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
f8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
f8f0: 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
f900: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
f910: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
f920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
f930: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f940: 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62  BLOB==OP_HexBlob
f950: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45   );.      n = pE
f960: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33  xpr->token.n - 3
f970: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  ;.      z = (cha
f980: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
f990: 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61 73 73  z + 2;.      ass
f9a0: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20  ert( n>=0 );.   
f9b0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
f9c0: 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20         z = "";. 
f9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f9e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
f9f0: 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  p, 0, 0, z, n);.
fa00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fa10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
fa20: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
fa30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
fa40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
fa50: 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
fa60: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
fa70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
fa80: 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
fa90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
faa0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
fab0: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
fac0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
fad0: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
fae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
faf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
fb00: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
fb10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fb20: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
fb30: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
fb40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fb50: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
fb60: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
fb70: 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
fb80: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
fb90: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
fba0: 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
fbb0: 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
fbc0: 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
fbd0: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
fbe0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fbf0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
fc00: 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
fc10: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
fc20: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
fc30: 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
fc40: 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
fc50: 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
fc60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
fc70: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
fc80: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
fc90: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
fca0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
fcb0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
fcc0: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
fcd0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
fce0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
fcf0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
fd00: 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
fd10: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
fd20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
fd30: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
fd40: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
fd50: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
fd60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
fd70: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
fd80: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
fd90: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
fda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fdb0: 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f 6f 70  beAddOp(v, to_op
fdc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
fdd0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
fde0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fdf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fe00: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
fe10: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
fe20: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
fe30: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
fe40: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
fe50: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
fe60: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
fe70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
fe80: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
fe90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
fea0: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
feb0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
fec0: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
fed0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
fee0: 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
fef0: 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
ff00: 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
ff10: 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
ff20: 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
ff30: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ff40: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ff50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ff60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ff70: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
ff80: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
ff90: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ffa0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
ffb0: 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29  Right, op, 0, 0)
ffc0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
ffd0: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72  g = -1;.      br
ffe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
fff0: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
10000 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
10010 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
10020 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
10030 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
10040 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
10050 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
10060 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
10070 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
10080 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
10090 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
100a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
100b0 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
100c0 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
100d0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
100e0 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
100f0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
10100 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
10110 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
10120 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
10130 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
10140 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
10150 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10160 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
10170 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
10180 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
10190 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
101a0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
101b0 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
101c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
101d0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
101e0 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
101f0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
10200 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
10210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10220 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
10230 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
10240 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
10250 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
10260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10270 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10280 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
10290 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
102a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
102b0 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
102c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
102d0 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
102e0 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
102f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
10300 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10310 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
10320 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
10330 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
10340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10350 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
10360 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
10370 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d  _FLOAT || pLeft-
10380 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
10390 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
103a0 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f   *p = &pLeft->to
103b0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ken;.        if(
103c0 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
103d0 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
103e0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 28 63    codeReal(v, (c
103f0 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c  har*)p->z, p->n,
10400 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
10410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
10420 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
10430 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20  ar*)p->z, p->n, 
10440 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
10450 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10460 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
10470 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
10480 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
10490 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
104a0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
104b0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
104c0 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
104d0 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
104e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
104f0 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
10500 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10510 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
10520 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
10530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10540 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
10550 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
10560 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
10570 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10580 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
10590 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
105a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
105b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
105c0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
105d0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
105e0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
105f0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
10600 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10610 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10620 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
10630 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10640 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
10650 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
10660 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  dest = sqlite3Vd
10670 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10680 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
10690 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
106a0 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
106b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
106c0 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
106d0 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
106e0 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
106f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10700 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
10710 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
10720 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
10730 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
10740 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
10750 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
10760 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10770 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
10780 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
10790 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  e: %T",.        
107a0 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e      &pExpr->span
107b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
107c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
107d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
107e0 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61  emLoad, pInfo->a
107f0 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67  Func[pExpr->iAgg
10800 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ].iMem, 0);.    
10810 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10820 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10830 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
10840 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
10850 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
10860 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
10870 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
10880 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
10890 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
108a0 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
108b0 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
108c0 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
108d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
108e0 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  Id;.      int co
108f0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nstMask = 0;.   
10900 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10910 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10920 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
10930 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
10940 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
10950 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20  *pColl = 0;..   
10960 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
10970 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
10980 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
10990 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
109a0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
109b0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
109c0 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
109d0 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30  d, nExpr, enc, 0
109e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
109f0 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20   pDef!=0 );.    
10a00 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
10a10 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
10a20 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29  t(pParse, pList)
10a30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10a40 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10a50 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
10a60 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
10a70 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
10a80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
10a90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
10aa0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
10ab0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
10ac0 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
10ad0 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
10ae0 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
10af0 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
10b00 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
10b10 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
10b20 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
10b30 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
10b40 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
10b50 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
10b60 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
10b70 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
10b80 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
10b90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
10ba0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
10bb0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
10bc0 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
10bd0 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
10be0 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
10bf0 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
10c00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10c10 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
10c20 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
10c30 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
10c40 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
10c50 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
10c60 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
10c70 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
10c80 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
10c90 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
10ca0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
10cb0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
10cc0 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
10cd0 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
10ce0 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
10cf0 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
10d00 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
10d10 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
10d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
10d30 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
10d40 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
10d50 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
10d60 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
10d70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
10d80 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20  if( nExpr>0 ){. 
10d90 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
10da0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
10db0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
10dc0 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
10dd0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
10de0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
10df0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10e00 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
10e10 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10e20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
10e30 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
10e40 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
10e50 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
10e60 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20  |= (1<<i);.     
10e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10e80 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
10e90 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  eq && !pColl ){.
10ea0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
10eb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
10ec0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
10ed0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
10ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10ef0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   }.      if( pDe
10f00 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  f->needCollSeq )
10f10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
10f20 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70  Coll ) pColl = p
10f30 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
10f40 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
10f50 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
10f60 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
10f70 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
10f80 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
10f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10fa0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10fb0 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73  P_Function, cons
10fc0 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63  tMask, nExpr, (c
10fd0 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55  har*)pDef, P3_FU
10fe0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74  NCDEF);.      st
10ff0 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70  ackChng = 1-nExp
11000 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
11010 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
11020 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
11030 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
11040 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
11050 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
11060 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
11070 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
11080 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
11090 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
110a0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
110b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
110c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
110d0 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43  mLoad, pExpr->iC
110e0 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
110f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11100 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72   "# load subquer
11110 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
11120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11130 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
11140 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
11150 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
11160 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74  inity;.      int
11170 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
11180 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
11190 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
111a0 20 20 20 20 20 69 6e 74 20 69 4c 61 62 65 6c 20       int iLabel 
111b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
111c0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
111d0 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
111e0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
111f0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  rse, pExpr, 0);.
11200 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
11210 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
11220 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
11230 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
11240 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
11250 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
11260 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
11270 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
11280 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
11290 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50  e for.      ** P
112a0 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3 of OP_MakeReco
112b0 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rd..      */.   
112c0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f     affinity = co
112d0 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
112e0 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20  (pExpr);..      
112f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11300 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11310 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
11320 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20  rse->ckOffset = 
11330 28 63 6b 4f 66 66 73 65 74 20 3f 20 28 63 6b 4f  (ckOffset ? (ckO
11340 66 66 73 65 74 2b 31 29 20 3a 20 30 29 3b 0a 0a  ffset+1) : 0);..
11350 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
11360 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
11370 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
11380 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
11390 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
113a0 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
113b0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
113c0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
113d0 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
113e0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
113f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
11400 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
11410 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
11420 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11430 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
11440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11450 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
11460 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20  -1, addr+4);    
11470 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
11480 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 0 */.      sql
11490 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
114a0 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
114b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
114d0 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
114e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11500 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 69  iLabel);.      i
11510 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
11520 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
11530 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
11540 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11550 6e 74 41 64 64 72 28 76 29 2b 33 3b 0a 20 20 20  ntAddr(v)+3;.   
11560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11570 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
11580 42 65 49 6e 74 2c 20 31 2c 20 69 41 64 64 72 29  BeInt, 1, iAddr)
11590 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
115a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
115b0 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70  _NotExists, pExp
115c0 72 2d 3e 69 54 61 62 6c 65 2c 20 69 41 64 64 72  r->iTable, iAddr
115d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
115e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
115f0 50 5f 47 6f 74 6f 2c 20 70 45 78 70 72 2d 3e 69  P_Goto, pExpr->i
11600 54 61 62 6c 65 2c 20 69 4c 61 62 65 6c 29 3b 0a  Table, iLabel);.
11610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11630 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
11640 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
11650 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20  inity, 1);   /* 
11660 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20  addr + 4 */.    
11670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11680 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
11690 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
116a0 20 69 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20   iLabel);.      
116b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
116c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
116d0 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20  ddImm, -1, 0);  
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 20  /* addr + 6 */. 
11700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11710 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11720 69 4c 61 62 65 6c 29 3b 0a 0a 20 20 20 20 20 20  iLabel);..      
11730 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
11740 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
11750 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
11760 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
11770 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
11780 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11790 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
117a0 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
117b0 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
117c0 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
117d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
117e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
117f0 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
11800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11810 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
11820 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11830 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
11840 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
11850 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
11860 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
11870 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  ight, OP_Ge, 0, 
11880 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11890 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
118a0 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
118b0 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
118c0 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
118d0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
118e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
118f0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
11900 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
11910 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
11920 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
11930 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
11940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11950 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30  (v, OP_And, 0, 0
11960 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11970 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11980 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
11990 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
119a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
119b0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74  pLeft);.      st
119c0 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
119d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
119e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
119f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78  : {.      int ex
11a00 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20  pr_end_label;.  
11a10 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74      int jumpInst
11a20 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
11a30 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  r;.      int i;.
11a40 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
11a50 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74  pEList;.      st
11a60 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11a70 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a  em *aListelem;..
11a80 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
11a90 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
11aa0 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
11ab0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20  >pList->nExpr % 
11ac0 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20  2) == 0);.      
11ad0 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
11ae0 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
11af0 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
11b00 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
11b10 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
11b20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
11b30 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
11b40 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78  >nExpr;.      ex
11b50 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73  pr_end_label = s
11b60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11b70 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
11b80 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
11b90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11ba0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11bb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
11bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
11bd0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
11be0 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
11bf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11c00 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
11c10 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  em[i].pExpr);.  
11c20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11c30 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
11c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11c50 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
11c60 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 1);.         
11c70 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65   jumpInst = code
11c80 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
11c90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c  pExpr->pLeft, aL
11ca0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
11cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b     OP_Ne, 0, 1);
11ce0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11cf0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11d00 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
11d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11d20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
11d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11d40 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
11d50 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
11d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11d70 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11d80 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
11d90 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
11da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11db0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11dc0 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b  expr_end_label);
11dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11de0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11df0 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20  jumpInst);.     
11e00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
11e10 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
11e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11e30 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
11e40 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
11e50 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11e60 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
11e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11e80 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
11e90 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
11ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ec0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
11ed0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11ef0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70  olveLabel(v, exp
11f00 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
11f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11f30 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
11f40 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
11f50 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
11f60 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
11f70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11f80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11fa0 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
11fb0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
11fc0 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
11fd0 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
11fe0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
11ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12000 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
12010 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
12020 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12030 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f  Expr->iColumn==O
12040 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20  E_Rollback ||.  
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12060 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
12070 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20   OE_Abort ||.   
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
12090 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
120a0 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20  OE_Fail );.     
120b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
120c0 74 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  teExpr(pParse->d
120d0 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
120e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
120f0 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p3(v, OP_Halt, S
12100 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12110 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
12120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12130 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12140 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
12150 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
12160 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
12170 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
12180 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
12190 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
121a0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
121b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
121c0 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20  _ContextPop, 0, 
121d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0);.         sql
121e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
121f0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
12200 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
12210 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
12220 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
12230 74 28 28 76 2c 20 22 23 20 72 61 69 73 65 28 49  t((v, "# raise(I
12240 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20  GNORE)"));.     
12250 20 7d 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68   }.      stackCh
12260 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
12270 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
12280 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  f.  }..  if( pPa
12290 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b  rse->ckOffset ){
122a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f  .    pParse->ckO
122b0 66 66 73 65 74 20 2b 3d 20 73 74 61 63 6b 43 68  ffset += stackCh
122c0 6e 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ng;.    assert( 
122d0 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
122e0 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64   );.  }.}..#ifnd
122f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
12300 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e  RIGGER./*.** Gen
12310 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
12320 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
12330 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
12340 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65 73  d leaves the res
12350 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  ult.** on the st
12360 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73  ack.  See also s
12370 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
12380 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12390 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
123a0 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c 74  cache the result
123b0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
123c0 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f  pExpr tree.** so
123d0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61   that it will ma
123e0 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63 61  ke use of the ca
123f0 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73  ched result on s
12400 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61  ubsequent evalua
12410 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20  tions.** rather 
12420 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68  than evaluate th
12430 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
12440 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69  on again.  Trivi
12450 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  al expressions a
12460 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64  re.** not cached
12470 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
12480 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20  sion is cached, 
12490 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73 74  its result is st
124a0 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65  ored in a .** me
124b0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
124c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
124d0 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
124e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
124f0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
12500 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
12510 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
12520 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  m;.  int addr1, 
12530 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d  addr2;.  if( v==
12540 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64  0 ) return;.  ad
12550 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
12560 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
12570 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
12580 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
12590 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c  );.  addr2 = sql
125a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
125b0 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64  ddr(v);.  if( ad
125c0 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73  dr2>addr1+1 || s
125d0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
125e0 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64  v, addr1)->opcod
125f0 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
12600 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78  {.    iMem = pEx
12610 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
12620 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
12630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12640 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
12650 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
12660 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
12670 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23  EGISTER;.  }.}.#
12680 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
12690 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
126a0 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
126b0 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
126c0 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
126d0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
126e0 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
126f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
12700 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
12710 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74  ments pushed ont
12720 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  o the stack..*/.
12730 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
12740 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
12750 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12760 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12770 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
12780 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20  st *pList    /* 
12790 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
127a0 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
127b0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
127c0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
127d0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
127e0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
127f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
12800 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
12810 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
12820 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20  t->a, i=n; i>0; 
12830 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
12840 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12850 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  de(pParse, pItem
12860 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ->pExpr);.  }.  
12870 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
12880 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12890 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
128a0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
128b0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
128c0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
128d0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
128e0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
128f0 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
12900 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
12910 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
12920 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
12930 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
12940 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
12950 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
12960 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
12970 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
12980 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
12990 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
129a0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Null flag is tru
129b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  e..**.** This co
129c0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
129d0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
129e0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
129f0 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
12a00 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
12a10 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
12a20 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
12a30 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
12a40 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
12a50 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
12a60 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
12a70 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
12a80 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
12a90 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
12aa0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
12ab0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
12ac0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
12ad0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
12ae0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
12af0 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
12b00 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
12b10 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
12b20 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
12b30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
12b40 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
12b50 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
12b60 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
12b70 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12b80 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
12b90 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20   int ckOffset = 
12ba0 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
12bb0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
12bc0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
12bd0 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  n;.  op = pExpr-
12be0 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
12bf0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
12c00 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
12c10 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
12c20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12c40 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
12c50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
12c60 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
12c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12c80 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
12c90 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
12ca0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
12cb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12cc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12cd0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
12ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12cf0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
12d00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
12d10 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
12d20 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
12d30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
12d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12d50 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
12d60 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
12d70 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
12d80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12d90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12da0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
12db0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
12dc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12dd0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
12de0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
12df0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12e00 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
12e10 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
12e20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
12e30 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
12e40 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
12e50 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
12e60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
12e70 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
12e80 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
12e90 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
12ea0 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
12eb0 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
12ec0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
12ed0 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
12ee0 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
12ef0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12f00 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
12f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12f20 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12f30 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
12f40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12f50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12f60 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
12f70 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
12f80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12f90 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
12fa0 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
12fb0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
12fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12fd0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
12fe0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
12ff0 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
13000 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
13010 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
13020 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
13030 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
13040 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ull );.      sql
13050 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
13060 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13070 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13080 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
13090 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
130a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
130b0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
130c0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
130d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78  he expression "x
130e0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
130f0 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  " is implemented
13100 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
13110 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c      ** 1 IF (x <
13120 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20   y) GOTO 3.     
13130 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a   ** 2 IF (x <= z
13140 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
13150 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20      ** 3 ....   
13160 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
13170 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
13180 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
13190 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
131a0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
131b0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
131c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
131d0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
131e0 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
131f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13200 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
13210 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13220 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13230 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
13240 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f     addr = codeCo
13250 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
13260 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
13270 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75  Lt, 0, !jumpIfNu
13280 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67  ll);..      pRig
13290 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
132a0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
132b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
132c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
132d0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
132e0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
132f0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
13300 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Le, dest, jump
13310 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
13320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13330 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13340 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
13350 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13360 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
13370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13380 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
13390 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
133a0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
133b0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
133c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
133d0 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
133e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
133f0 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d  Op(v, OP_If, jum
13400 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
13410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13420 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
13430 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66  >ckOffset = ckOf
13440 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  fset;.}../*.** G
13450 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
13460 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
13470 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
13480 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
13490 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
134a0 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
134b0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
134c0 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
134d0 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
134e0 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
134f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
13500 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
13510 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
13520 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
13530 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
13540 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
13550 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
13560 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66 61  ll is true or fa
13570 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
13580 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73  mpIfNull is fals
13590 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
135a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
135b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
135c0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
135d0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
135e0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
135f0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13600 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
13610 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70  int ckOffset = p
13620 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b  Parse->ckOffset;
13630 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
13640 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
13650 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
13660 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
13670 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
13680 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
13690 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
136a0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
136b0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
136c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
136d0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
136e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
136f0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
13700 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
13710 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
13720 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
13730 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
13750 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
13760 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
13770 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
13780 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
13790 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
137a0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
137b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
137c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
137e0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
137f0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
13800 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
13810 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
13820 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
13830 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
13840 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
13850 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
13860 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
13870 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
13880 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
13890 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
138a0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
138b0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
138c0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
138d0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
138e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
138f0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
13900 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
13910 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
13920 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
13930 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
13940 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
13950 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
13960 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
13970 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
13980 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13990 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
139a0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
139b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
139c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
139d0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
139e0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
139f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
13a00 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
13a20 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
13a30 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
13a40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
13a50 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
13a60 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
13a70 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
13a80 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
13a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
13aa0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
13ab0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
13ac0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
13ad0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
13ae0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
13af0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
13b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
13b10 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
13b20 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
13b30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13b40 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
13b50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
13b60 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
13b70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
13b80 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
13b90 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
13ba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13bb0 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
13bc0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
13bd0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
13be0 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
13bf0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
13c00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13c10 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
13c20 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
13c30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
13c40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
13c50 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
13c60 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
13c70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13c80 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
13c90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13ca0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
13cb0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
13cc0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
13cd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13ce0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
13cf0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
13d00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13d10 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
13d20 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
13d30 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
13d40 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
13d50 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
13d60 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
13d70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13d80 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13d90 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
13da0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
13db0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
13dc0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
13dd0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
13de0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
13df0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
13e00 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
13e10 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
13e20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13e30 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
13e40 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
13e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13e60 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13e70 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
13e80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13e90 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
13ea0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
13eb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13ec0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
13ed0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
13ee0 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42  pression is "x B
13ef0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e  ETWEEN y AND z".
13f00 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   It is implement
13f10 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
13f20 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
13f30 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20   >= y) GOTO 3.  
13f40 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64      ** 2 GOTO <d
13f50 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
13f60 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20  IF (x > z) GOTO 
13f70 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a  <dest>.      */.
13f80 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
13f90 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
13fa0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
13fb0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
13fc0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
13fd0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
13fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13ff0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
14000 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
14010 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14020 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
14030 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14040 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
14050 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
14060 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
14070 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14080 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
14090 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
140a0 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61  pRight, OP_Ge, a
140b0 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75  ddr+3, !jumpIfNu
140c0 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
140d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
140e0 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
140f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14100 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
14110 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
14120 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
14130 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
14140 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
14150 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14160 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
14170 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
14180 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
14190 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74  ght, OP_Gt, dest
141a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
141b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
141c0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
141d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
141e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
141f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
14200 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14210 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49   OP_IfNot, jumpI
14220 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
14230 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14240 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63  .  }.  pParse->c
14250 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73  kOffset = ckOffs
14260 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  et;.}../*.** Do 
14270 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
14280 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
14290 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
142a0 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
142b0 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
142c0 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
142d0 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
142e0 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
142f0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f  ny way..**.** So
14300 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75  metimes this rou
14310 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14320 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74   FALSE even if t
14330 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
14340 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
14350 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
14360 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
14370 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
14380 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
14390 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
143a0 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20  n FALSE just to 
143b0 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
143c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
143d0 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74  returns false, t
143e0 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72  hen you do not r
143f0 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63  eally know for c
14400 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77  ertain if the tw
14410 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
14420 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
14430 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61  But if you get a
14440 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68   TRUE return, th
14450 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65  en you.** can be
14460 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65 73   sure the expres
14470 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61  sions are the sa
14480 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63  me.  In the plac
14490 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73  es where.** this
144a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
144b0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75  , it does not hu
144c0 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74  rt to get an ext
144d0 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a  ra FALSE - that.
144e0 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65  ** just might re
144f0 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69  sult in some sli
14500 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64  ghtly slower cod
14510 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e  e.  But returnin
14520 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63  g.** an incorrec
14530 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61  t TRUE could lea
14540 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69  d to a malfuncti
14550 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
14560 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
14570 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
14580 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
14590 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29  ( pA==0||pB==0 )
145a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
145b0 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  =pA;.  }.  if( p
145c0 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
145d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
145e0 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pA->flags & EP_
145f0 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e  Distinct)!=(pB->
14600 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
14610 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nct) ) return 0;
14620 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
14630 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
14640 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
14650 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14660 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
14670 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
14680 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
14690 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
146a0 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
146b0 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
146c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
146d0 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
146e0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
146f0 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
14700 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
14710 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
14720 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
14730 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
14740 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
14750 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14760 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  , pB->pList->a[i
14770 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
14780 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14790 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
147a0 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73  lse if( pB->pLis
147b0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
147c0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
147d0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e  >pSelect || pB->
147e0 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
147f0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   0;.  if( pA->iT
14800 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
14810 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
14820 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
14830 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
14840 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  A->op!=TK_COLUMN
14850 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pA->token.z 
14860 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  ){.    if( pB->t
14870 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75  oken.z==0 ) retu
14880 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42  rn 0;.    if( pB
14890 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74  ->token.n!=pA->t
148a0 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20  oken.n ) return 
148b0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
148c0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
148d0 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63  *)pA->token.z,(c
148e0 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pB->token.z
148f0 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30  ,pB->token.n)!=0
14900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14910 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
14920 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a  return 1;.}.../*
14930 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
14940 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
14950 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
14960 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
14970 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
14980 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
14990 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
149a0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
149b0 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
149c0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
149d0 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
149e0 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
149f0 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
14a00 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
14a10 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
14a20 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
14a30 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
14a40 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
14a50 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
14a60 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
14a70 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
14a80 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  umn,.       &pIn
14a90 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c 6f 63  fo->nColumnAlloc
14aa0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
14ab0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
14ac0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
14ad0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
14ae0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
14af0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
14b00 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
14b10 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
14b20 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
14b30 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
14b40 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
14b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
14b60 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
14b70 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
14b80 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
14b90 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
14ba0 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
14bb0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
14bc0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
14bd0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
14be0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
14bf0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
14c00 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
14c10 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
14c20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
14c30 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
14c40 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
14c50 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
14c60 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20  his is an xFunc 
14c70 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
14c80 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  () used to imple
14c90 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ment .** sqlite3
14ca0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14cb0 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
14cc0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
14cd0 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
14ce0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
14cf0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
14d00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
14d10 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65 67  lyzes the aggreg
14d20 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  ate function at 
14d30 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
14d40 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
14d50 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67  egate(void *pArg
14d60 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
14d70 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
14d80 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e  ontext *pNC = (N
14d90 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72  ameContext *)pAr
14da0 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g;.  Parse *pPar
14db0 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
14dc0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
14dd0 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
14de0 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
14df0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
14e00 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
14e10 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
14e20 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14e30 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
14e40 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
14e50 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  {.      /* Check
14e60 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
14e70 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
14e80 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
14e90 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
14ea0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
14eb0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
14ec0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53   */.      if( pS
14ed0 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
14ee0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14ef0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
14f00 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
14f10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14f20 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
14f30 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
14f40 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
14f50 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
14f60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14f70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
14f80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b  Item->iCursor ){
14f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
14fa0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
14fb0 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
14fc0 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65   that pExpr refe
14fd0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20  rs to a table.  
14fe0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
14ff0 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  t is in the FROM
15000 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61   clause of the a
15010 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20  ggregate query. 
15020 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
15030 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
15040 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  Make an entry fo
15050 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  r the column in 
15060 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
15070 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20   if there.      
15080 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
15090 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61  an entry there a
150a0 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20  lready..        
150b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
150c0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
150d0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67        pCol = pAg
150e0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20  gInfo->aCol;.   
150f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
15100 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; k<pAggInfo->nC
15110 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c  olumn; k++, pCol
15120 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
15130 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61     if( pCol->iTa
15140 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
15150 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
15160 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
15170 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
15180 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
15190 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
151b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
151c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6b            if( (k
151d0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  >=pAggInfo->nCol
151e0 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  umn).           
151f0 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67    && (k = addAgg
15200 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  InfoColumn(pPars
15210 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
15220 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  )>=0 .          
15230 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
15240 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49     pCol = &pAggI
15250 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20  nfo->aCol[k];.  
15260 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
15270 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ->pTab = pExpr->
15280 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
15290 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65      pCol->iTable
152a0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
152b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
152c0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pCol->iColumn = 
152d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
152f0 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  ol->iMem = pPars
15300 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
15310 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
15320 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d  SorterColumn = -
15330 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
15340 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70   pCol->pExpr = p
15350 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
15360 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
15370 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
15390 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20  t j, n;.        
153a0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
153b0 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f   *pGB = pAggInfo
153c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
153d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
153e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
153f0 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61   *pTerm = pGB->a
15400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15410 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72    n = pGB->nExpr
15420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
15430 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20    for(j=0; j<n; 
15440 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72   Expr *pE = pTer
15470 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
15480 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15490 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pE->op==TK_COLUM
154a0 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d  N && pE->iTable=
154b0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
154c0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
154d0 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c          pE->iCol
154e0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
154f0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
15500 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
15510 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
15520 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
15530 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
15560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
15580 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
15590 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  rterColumn<0 ){.
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
155c0 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  umn = pAggInfo->
155d0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b  nSortingColumn++
155e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
155f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
15600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15610 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65  here is now an e
15620 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20 69  ntry for pExpr i
15630 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
15640 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20 20  [] (either.     
15650 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73         ** becaus
15660 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20 62  e it was there b
15670 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65  efore or because
15680 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65 64   we just created
15690 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20   it)..          
156a0 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    ** Convert the
156b0 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20 54   pExpr to be a T
156c0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66  K_AGG_COLUMN ref
156d0 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20  erring to that. 
156e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41             ** pA
156f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65  ggInfo->aCol[] e
15700 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20  ntry..          
15710 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
15720 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
15730 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
15740 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
15750 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  op = TK_AGG_COLU
15760 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
15770 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 6b 3b  pExpr->iAgg = k;
15780 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15790 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ak;.          } 
157a0 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e  /* endif pExpr->
157b0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
157c0 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  Cursor */.      
157d0 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20    } /* end loop 
157e0 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f  over pSrcList */
157f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15800 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
15810 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
15820 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
15830 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65   /* The pNC->nDe
15840 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73  pth==0 test caus
15850 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
15860 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65  ctions in subque
15870 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ries.      ** to
15880 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20   be ignored */. 
15890 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
158a0 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
158b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
158c0 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20 61  ee if pExpr is a
158d0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
158e0 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65 20  other aggregate 
158f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
15900 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72  tion that is alr
15910 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67 67  eady in the pAgg
15920 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  Info structure. 
15930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15940 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
15950 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70  _func *pItem = p
15960 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a  AggInfo->aFunc;.
15970 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
15980 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
15990 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  nc; i++, pItem++
159a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
159b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
159c0 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
159d0 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  , pExpr) ){.    
159e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
159f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15a10 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46   i>=pAggInfo->nF
15a20 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unc ){.         
15a30 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69   /* pExpr is ori
15a40 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e  ginal.  Make a n
15a50 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67  ew entry in pAgg
15a60 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20  Info->aFunc[].  
15a70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
15a80 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
15a90 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
15aa0 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64           i = add
15ab0 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72  AggInfoFunc(pPar
15ac0 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
15ad0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
15ae0 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
15af0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
15b00 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
15b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
15b20 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
15b30 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
15b40 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50  pItem->iMem = pP
15b50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
15b60 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
15b70 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
15b80 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
15b90 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
15bb0 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
15bc0 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
15bd0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
15be0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
15bf0 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
15c00 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
15c10 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
15c20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
15c30 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
15c40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15c50 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
15c60 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
15c70 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
15c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15c90 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
15ca0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
15cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15cd0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
15ce0 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
15cf0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
15d00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
15d10 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
15d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
15d30 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
15d40 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
15d50 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
15d60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15d70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
15d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72  .  }..  /* Recur
15d90 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71  sively walk subq
15da0 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ueries looking f
15db0 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  or TK_COLUMN nod
15dc0 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a  es that need.  *
15dd0 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20  * to be changed 
15de0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
15df0 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74  .  But increment
15e00 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a   nDepth so that.
15e10 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43    ** TK_AGG_FUNC
15e20 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75  TION nodes in su
15e30 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65  bqueries will be
15e40 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
15e50 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
15e60 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43  elect ){.    pNC
15e70 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
15e80 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70  walkSelectExpr(p
15e90 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61  Expr->pSelect, a
15ea0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
15eb0 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e   pNC);.    pNC->
15ec0 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20  nDepth--;.  }.  
15ed0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15ee0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
15ef0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
15f00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
15f10 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
15f20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
15f30 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
15f40 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
15f50 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
15f60 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
15f70 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
15f80 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
15f90 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
15fa0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
15fb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15fc0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
15fd0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
15fe0 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
15ff0 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
16000 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
16010 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a  solveNames()..**
16020 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72  .** If errors ar
16030 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e  e seen, leave an
16040 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
16050 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  n zErrMsg and re
16060 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
16070 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
16080 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
16090 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
160a0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
160b0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
160c0 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70  {.  int nErr = p
160d0 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72  NC->pParse->nErr
160e0 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
160f0 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41  (pExpr, analyzeA
16100 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a  ggregate, pNC);.
16110 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50    return pNC->pP
16120 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72  arse->nErr - nEr
16130 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  r;.}../*.** Call
16140 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
16150 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
16160 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
16170 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
16180 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
16190 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
161a0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
161b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
161c0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
161d0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
161e0 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rt..*/.int sqlit
161f0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
16200 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
16210 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
16220 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
16230 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16240 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
16250 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
16260 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
16270 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
16280 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72  ist->a, i=0; nEr
16290 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d  r==0 && i<pList-
162a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
162b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72  em++){.      nEr
162c0 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r += sqlite3Expr
162d0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
162e0 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
162f0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
16300 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
16310 0a                                               .