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

Artifact ecb3b23d3543427cba3e2ac12a6c6ae4bb20d39b:


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 37 33 20 32 30 30 38 2f 30 36 2f 30 35 20  .373 2008/06/05 
0220: 31 36 3a 34 37 3a 33 39 20 64 61 6e 69 65 6c 6b  16:47:39 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 6e 74 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  int op = pExpr->
04c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
04d0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
04e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
04f0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0500: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
0510: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0530: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0540: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0550: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0560: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0570: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0580: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
0590: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
05a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
05b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
05c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
05d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
05e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
05f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0600: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0610: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0620: 72 20 74 6f 20 74 68 65 20 72 65 76 69 73 65 64  r to the revised
0630: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
0640: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0650: 71 75 65 6e 63 65 20 69 73 20 6d 61 72 6b 65 64  quence is marked
0660: 20 61 73 20 22 65 78 70 6c 69 63 69 74 22 20 75   as "explicit" u
0670: 73 69 6e 67 20 74 68 65 20 45 50 5f 45 78 70 43  sing the EP_ExpC
0680: 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20  ollate.** flag. 
0690: 20 41 6e 20 65 78 70 6c 69 63 69 74 20 63 6f 6c   An explicit col
06a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
06b0: 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 20 69 6d  will override im
06c0: 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74  plicit.** collat
06d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a  ing sequences..*
06e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
06f0: 78 70 72 53 65 74 43 6f 6c 6c 28 50 61 72 73 65  xprSetColl(Parse
0700: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0710: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
0720: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  ame){.  char *zC
0730: 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oll = 0;        
0740: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
0750: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
0760: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
0770: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
0780: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
0790: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
07a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
07b0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
07c0: 26 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70  & zColl ){.    p
07d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
07e0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
07f0: 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a  se, zColl, -1);.
0800: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
0810: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43  .      pExpr->pC
0820: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
0830: 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
0840: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
0850: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
0860: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
0870: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  );.  return pExp
0880: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0890: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
08a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
08b0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
08c0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
08d0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
08e0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
08f0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
0900: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
0910: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
0920: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
0930: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
0940: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0950: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
0960: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20  .    int op;.   
0970: 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e   pColl = pExpr->
0980: 70 43 6f 6c 6c 3b 0a 20 20 20 20 6f 70 20 3d 20  pColl;.    op = 
0990: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 69  pExpr->op;.    i
09a0: 66 28 20 28 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  f( (op==TK_CAST 
09b0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 29  || op==TK_UPLUS)
09c0: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
09d0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
09e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
09f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
0a00: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ft);.    }.  }. 
0a10: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0a20: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0a30: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0a40: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0a50: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0a60: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0a70: 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61   an operand of a
0a80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0a90: 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74  ator.  aff2 is t
0aa0: 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e  he.** type affin
0ab0: 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ity of the other
0ac0: 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
0ad0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0ae0: 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69  the.** type affi
0af0: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0b00: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0b10: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0b20: 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  ator..*/.char sq
0b30: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0b40: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0b50: 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20  , char aff2){.  
0b60: 63 68 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69  char aff1 = sqli
0b70: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0b80: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66  pExpr);.  if( af
0b90: 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20  f1 && aff2 ){.  
0ba0: 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20    /* Both sides 
0bb0: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0bc0: 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49  n are columns. I
0bd0: 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69  f one has numeri
0be0: 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74  c.    ** affinit
0bf0: 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68  y, use that. Oth
0c00: 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66  erwise use no af
0c10: 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20  finity..    */. 
0c20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
0c30: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
0c40: 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33  aff1) || sqlite3
0c50: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0c60: 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20  y(aff2) ){.     
0c70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0c80: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0ca0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0cb0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0cc0: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0cd0: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0ce0: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0cf0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0d00: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0d10: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0d20: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0d30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
0d40: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0d50: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
0d60: 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73    /* One side is
0d70: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f   a column, the o
0d80: 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65  ther is not. Use
0d90: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66   the columns aff
0da0: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73  inity. */.    as
0db0: 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c  sert( aff1==0 ||
0dc0: 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20   aff2==0 );.    
0dd0: 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61  return (aff1 + a
0de0: 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ff2);.  }.}../*.
0df0: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
0e00: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
0e10: 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74  r.  Return the t
0e20: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0e30: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61  t should.** be a
0e40: 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f  pplied to both o
0e50: 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f  perands prior to
0e60: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61   doing the compa
0e70: 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  rison..*/.static
0e80: 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e   char comparison
0e90: 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70  Affinity(Expr *p
0ea0: 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66  Expr){.  char af
0eb0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f;.  assert( pEx
0ec0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
0ed0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
0ee0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  N || pExpr->op==
0ef0: 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LT ||.       
0f00: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
0f10: 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GT || pExpr->op
0f20: 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72  ==TK_GE || pExpr
0f30: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20  ->op==TK_LE ||. 
0f40: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
0f50: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61  op==TK_NE );.  a
0f60: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
0f70: 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73  eft );.  aff = s
0f80: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
0f90: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
0fa0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ;.  if( pExpr->p
0fb0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66  Right ){.    aff
0fc0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
0fd0: 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  eAffinity(pExpr-
0fe0: 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20  >pRight, aff);. 
0ff0: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45   }.  else if( pE
1000: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
1010: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1020: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1030: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d  (pExpr->pSelect-
1040: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1050: 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20  xpr, aff);.  }. 
1060: 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29   else if( !aff )
1070: 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49  {.    aff = SQLI
1080: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
1090: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
10a0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
10b0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78   a comparison ex
10c0: 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d  pression, eg. '=
10d0: 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20  ', '<', IN(...) 
10e0: 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69  etc..** idx_affi
10f0: 6e 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69  nity is the affi
1100: 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78  nity of an index
1110: 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72  ed column. Retur
1120: 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65  n true.** if the
1130: 20 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69   index with affi
1140: 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74  nity idx_affinit
1150: 79 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  y may be used to
1160: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68   implement.** th
1170: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  e comparison in 
1180: 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pExpr..*/.int sq
1190: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
11a0: 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72  tyOk(Expr *pExpr
11b0: 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e  , char idx_affin
11c0: 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ity){.  char aff
11d0: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
11e0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
11f0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
1200: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1210: 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72  FF_NONE:.      r
1220: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73  eturn 1;.    cas
1230: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
1240: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
1250: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
1260: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
1270: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1280: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1290: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
12a0: 79 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  y(idx_affinity);
12b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12c0: 74 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75  turn the P5 valu
12d0: 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
12e0: 20 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61   used for a bina
12f0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  ry comparison.**
1300: 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20   opcode (OP_Eq, 
1310: 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64  OP_Ge etc.) used
1320: 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70   to compare pExp
1330: 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a  r1 and pExpr2..*
1340: 2f 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61  /.static u8 bina
1350: 72 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72  ryCompareP5(Expr
1360: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
1370: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
1380: 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66  IfNull){.  u8 af
1390: 66 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65  f = (char)sqlite
13a0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
13b0: 78 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 73  xpr2);.  aff = s
13c0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
13d0: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
13e0: 66 29 20 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3b  f) | jumpIfNull;
13f0: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
1400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1410: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1420: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1430: 63 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ce that should b
1440: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62  e used by.** a b
1450: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1460: 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72   operator compar
1470: 69 6e 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ing pLeft and pR
1480: 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ight..**.** If t
1490: 68 65 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70  he left hand exp
14a0: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
14b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14c0: 20 74 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69   type, then it i
14d0: 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72  s.** used. Other
14e0: 77 69 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  wise the collati
14f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
1500: 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 65  the right hand e
1510: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
1520: 75 73 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66  used, or the def
1530: 61 75 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66  ault (BINARY) if
1540: 20 6e 65 69 74 68 65 72 20 65 78 70 72 65 73 73   neither express
1550: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1560: 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a  ing.** type..**.
1570: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 52 69 67  ** Argument pRig
1580: 68 74 20 28 62 75 74 20 6e 6f 74 20 70 4c 65 66  ht (but not pLef
1590: 74 29 20 6d 61 79 20 62 65 20 61 20 6e 75 6c 6c  t) may be a null
15a0: 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20 74 68 69   pointer. In thi
15b0: 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74 20 69 73  s case,.** it is
15c0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
15d0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
15e0: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
15f0: 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50 61 72 73  eCollSeq(.  Pars
1600: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 45 78  e *pParse, .  Ex
1610: 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20 20 45 78  pr *pLeft, .  Ex
1620: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
1630: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1640: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
1650: 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  );.  if( pLeft->
1660: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1670: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73 73  llate ){.    ass
1680: 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ert( pLeft->pCol
1690: 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  l );.    pColl =
16a0: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20   pLeft->pColl;. 
16b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
16c0: 74 20 26 26 20 70 52 69 67 68 74 2d 3e 66 6c 61  t && pRight->fla
16d0: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
16e0: 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  te ){.    assert
16f0: 28 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20  ( pRight->pColl 
1700: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70  );.    pColl = p
1710: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  Right->pColl;.  
1720: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 6c 6c  }else{.    pColl
1730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1740: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
1750: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 21 70  eft);.    if( !p
1760: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
1770: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1780: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1790: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a   pRight);.    }.
17a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
17b0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ll;.}../*.** Gen
17c0: 65 72 61 74 65 20 74 68 65 20 6f 70 65 72 61 6e  erate the operan
17d0: 64 73 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  ds for a compari
17e0: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  son operation.  
17f0: 42 65 66 6f 72 65 0a 2a 2a 20 67 65 6e 65 72 61  Before.** genera
1800: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 66 6f  ting the code fo
1810: 72 20 65 61 63 68 20 6f 70 65 72 61 6e 64 2c 20  r each operand, 
1820: 73 65 74 20 74 68 65 20 45 50 5f 41 6e 79 41 66  set the EP_AnyAf
1830: 66 0a 2a 2a 20 66 6c 61 67 20 6f 6e 20 74 68 65  f.** flag on the
1840: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
1850: 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61  hat it will be a
1860: 62 6c 65 20 74 6f 20 75 73 65 64 20 61 0a 2a 2a  ble to used a.**
1870: 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 76   cached column v
1880: 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 70 72  alue that has pr
1890: 65 76 69 6f 75 73 6c 79 20 75 6e 64 65 72 67 6f  eviously undergo
18a0: 6e 65 20 61 6e 0a 2a 2a 20 61 66 66 69 6e 69 74  ne an.** affinit
18b0: 79 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61  y change..*/.sta
18c0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 43 6f 6d  tic void codeCom
18d0: 70 61 72 65 4f 70 65 72 61 6e 64 73 28 0a 20 20  pareOperands(.  
18e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1900: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1910: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1920: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
1930: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
1940: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  and */.  int *pR
1950: 65 67 4c 65 66 74 2c 20 20 20 20 2f 2a 20 52 65  egLeft,    /* Re
1960: 67 69 73 74 65 72 20 77 68 65 72 65 20 6c 65 66  gister where lef
1970: 74 20 6f 70 65 72 61 6e 64 20 69 73 20 73 74 6f  t operand is sto
1980: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  red */.  int *pF
1990: 72 65 65 4c 65 66 74 2c 20 20 20 2f 2a 20 46 72  reeLeft,   /* Fr
19a0: 65 65 20 74 68 69 73 20 72 65 67 69 73 74 65 72  ee this register
19b0: 20 77 68 65 6e 20 64 6f 6e 65 20 2a 2f 0a 20 20   when done */.  
19c0: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
19d0: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f    /* The right o
19e0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
19f0: 2a 70 52 65 67 52 69 67 68 74 2c 20 20 20 2f 2a  *pRegRight,   /*
1a00: 20 52 65 67 69 73 74 65 72 20 77 68 65 72 65 20   Register where 
1a10: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 69 73  right operand is
1a20: 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74   stored */.  int
1a30: 20 2a 70 46 72 65 65 52 69 67 68 74 20 20 20 2f   *pFreeRight   /
1a40: 2a 20 57 72 69 74 65 20 74 65 6d 70 20 72 65 67  * Write temp reg
1a50: 69 73 74 65 72 20 66 6f 72 20 72 69 67 68 74 20  ister for right 
1a60: 6f 70 65 72 61 6e 64 20 74 68 65 72 65 20 2a 2f  operand there */
1a70: 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 4c 65  .){.  while( pLe
1a80: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53  ft->op==TK_UPLUS
1a90: 20 29 20 70 4c 65 66 74 20 3d 20 70 4c 65 66 74   ) pLeft = pLeft
1aa0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 4c 65 66 74  ->pLeft;.  pLeft
1ab0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 41 6e  ->flags |= EP_An
1ac0: 79 41 66 66 3b 0a 20 20 2a 70 52 65 67 4c 65 66  yAff;.  *pRegLef
1ad0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
1ae0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1af0: 70 4c 65 66 74 2c 20 70 46 72 65 65 4c 65 66 74  pLeft, pFreeLeft
1b00: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 69 67  );.  while( pRig
1b10: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53  ht->op==TK_UPLUS
1b20: 20 29 20 70 52 69 67 68 74 20 3d 20 70 52 69 67   ) pRight = pRig
1b30: 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 52 69  ht->pLeft;.  pRi
1b40: 67 68 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  ght->flags |= EP
1b50: 5f 41 6e 79 41 66 66 3b 0a 20 20 2a 70 52 65 67  _AnyAff;.  *pReg
1b60: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
1b70: 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1b80: 73 65 2c 20 70 52 69 67 68 74 2c 20 70 46 72 65  se, pRight, pFre
1b90: 65 52 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eRight);.}../*.*
1ba0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bb0: 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  for a comparison
1bc0: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   operator..*/.st
1bd0: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d  atic int codeCom
1be0: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
1bf0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65  Parse,    /* The
1c00: 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f   parsing (and co
1c10: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63  de generating) c
1c20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1c30: 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a   *pLeft,      /*
1c40: 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   The left operan
1c50: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  d */.  Expr *pRi
1c60: 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ght,     /* The 
1c70: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
1c80: 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20  .  int opcode,  
1c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
1ca0: 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  arison opcode */
1cb0: 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20  .  int in1, int 
1cc0: 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72  in2, /* Register
1cd0: 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64   holding operand
1ce0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  s */.  int dest,
1cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d00: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
1d10: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
1d20: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
1d30: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
1d40: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
1d50: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35  L */.){.  int p5
1d60: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
1d70: 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20  CollSeq *p4;..  
1d80: 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  p4 = sqlite3Bina
1d90: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1da0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1db0: 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20  pRight);.  p5 = 
1dc0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1dd0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a  pLeft, pRight, j
1de0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64  umpIfNull);.  ad
1df0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
1e00: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
1e10: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e  Vdbe, opcode, in
1e20: 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20  2, dest, in1,.  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1e50: 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  p4, P4_COLLSEQ);
1e60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1e70: 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70  angeP5(pParse->p
1e80: 56 64 62 65 2c 20 70 35 29 3b 0a 20 20 69 66 28  Vdbe, p5);.  if(
1e90: 20 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46   p5 & SQLITE_AFF
1ea0: 5f 4d 41 53 4b 20 29 7b 0a 20 20 20 20 73 71 6c  _MASK ){.    sql
1eb0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1ec0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1ed0: 73 65 2c 20 69 6e 31 2c 20 31 29 3b 0a 20 20 20  se, in1, 1);.   
1ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1ef0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1f00: 70 50 61 72 73 65 2c 20 69 6e 32 2c 20 31 29 3b  pParse, in2, 1);
1f10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
1f20: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
1f30: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
1f40: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
1f50: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
1f60: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
1f70: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1f80: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
1f90: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
1fa0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
1fb0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
1fc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
1fd0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61  * pParse..*/.sta
1fe0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 45 78 70  tic int checkExp
1ff0: 72 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  rHeight(Parse *p
2000: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2010: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2030: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2040: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2050: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2060: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2070: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
2080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2090: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
20a0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
20b0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
20c0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
20d0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
20e0: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
20f0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2110: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2120: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2130: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2140: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2150: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2160: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2170: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
2180: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
2190: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
21a0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
21b0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
21c0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
21d0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
21e0: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
21f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2200: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2210: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2220: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2230: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2240: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2250: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2260: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2270: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
2280: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
2290: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
22a0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
22b0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
22c0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
22d0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
22e0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
22f0: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
2300: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2310: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2320: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2330: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2340: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2350: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2370: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
2380: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
2390: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
23a0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
23b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
23c0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
23d0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
23e0: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
23f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
2400: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2410: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2420: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2430: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2440: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2450: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2460: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2470: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2480: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
2490: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
24a0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
24b0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
24c0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
24d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
24e0: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
24f0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2500: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2510: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2520: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2530: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2540: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2550: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2560: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2570: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2580: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2590: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
25a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
25b0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
25c0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
25d0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
25e0: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
25f0: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
2600: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2610: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2620: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2630: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2640: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2650: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2670: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2680: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2690: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
26a0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
26b0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
26c0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
26d0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
26e0: 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66  ght);.  heightOf
26f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73  ExprList(p->pLis
2700: 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, &nHeight);.  
2710: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2720: 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69  ->pSelect, &nHei
2730: 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67  ght);.  p->nHeig
2740: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
2750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2760: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
2770: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
2780: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
2790: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
27a0: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
27b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
27c0: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
27d0: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
27e0: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
27f0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
2800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2810: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61  ExprSetHeight(Pa
2820: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2830: 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74  r *p){.  exprSet
2840: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 63 68 65  Height(p);.  che
2850: 63 6b 45 78 70 72 48 65 69 67 68 74 28 70 50 61  ckExprHeight(pPa
2860: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
2870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2880: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  n the maximum he
2890: 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72  ight of any expr
28a0: 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65  ession tree refe
28b0: 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65  renced.** by the
28c0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
28d0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
28e0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
28f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2900: 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a  rHeight(Select *
2910: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
2920: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
2930: 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69  fSelect(p, &nHei
2940: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ght);.  return n
2950: 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 0a  Height;.}.#else.
2960: 20 20 23 64 65 66 69 6e 65 20 63 68 65 63 6b 45    #define checkE
2970: 78 70 72 48 65 69 67 68 74 28 78 2c 79 29 0a 20  xprHeight(x,y). 
2980: 20 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74   #define exprSet
2990: 48 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66  Height(y).#endif
29a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45   /* SQLITE_MAX_E
29b0: 58 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a  XPR_DEPTH>0 */..
29c0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
29d0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
29e0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
29f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2a00: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2a10: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
2a20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2a30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54  te3_malloc().  T
2a40: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2a50: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
2a60: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
2a70: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
2a80: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
2a90: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
2aa0: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
2ab0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
2ac0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
2ad0: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
2ae0: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
2af0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
2b00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
2b10: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
2b20: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
2b30: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
2b40: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
2b50: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
2b60: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
2b70: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
2b80: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
2b90: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
2ba0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
2bb0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
2bc0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
2bd0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2be0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
2bf0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e  Expr));.  if( pN
2c00: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
2c10: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
2c20: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
2c30: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
2c40: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
2c50: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
2c60: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
2c70: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
2c80: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
2c90: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
2ca0: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
2cb0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2cc0: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
2cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ce0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
2cf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2d00: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
2d10: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
2d20: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
2d30: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
2d40: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
2d50: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
2d60: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
2d70: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
2d80: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
2d90: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
2da0: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
2db0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
2dc0: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  ){.    if( pRigh
2dd0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2de0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
2df0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
2e00: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
2e10: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2e20: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
2e30: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
2e40: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
2e50: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
2e60: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
2e70: 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43  oll = pRight->pC
2e80: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2e90: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74   }.    if( pLeft
2ea0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
2eb0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
2ec0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
2ed0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
2ee0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
2ef0: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
2f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
2f10: 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65 77  prSetHeight(pNew
2f20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
2f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73  ;.}../*.** Works
2f40: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
2f50: 72 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  r() except that 
2f60: 69 74 20 74 61 6b 65 73 20 61 6e 20 65 78 74 72  it takes an extr
2f70: 61 20 50 61 72 73 65 2a 0a 2a 2a 20 61 72 67 75  a Parse*.** argu
2f80: 6d 65 6e 74 20 61 6e 64 20 6e 6f 74 69 66 69 65  ment and notifie
2f90: 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2fa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65   connection obje
2fb0: 63 74 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ct if malloc fai
2fc0: 6c 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ls..*/.Expr *sql
2fd0: 69 74 65 33 50 45 78 70 72 28 0a 20 20 50 61 72  ite3PExpr(.  Par
2fe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2ff0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3000: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3010: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3020: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
3030: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45  on opcode */.  E
3040: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
3050: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f         /* Left o
3060: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
3070: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20   *pRight,       
3080: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65      /* Right ope
3090: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
30a0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20  Token *pToken   
30b0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
30c0: 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ken */.){.  Expr
30d0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
30e0: 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70  r(pParse->db, op
30f0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
3100: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
3110: 70 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 45 78  p ){.    checkEx
3120: 70 72 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  prHeight(pParse,
3130: 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20   p->nHeight);.  
3140: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3150: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
3160: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
3170: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
3180: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
3190: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
31a0: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
31b0: 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68     #1 #2 ...  Th
31c0: 65 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20  ese terms refer 
31d0: 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  to registers.** 
31e0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
31f0: 61 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74  achine.  #N is t
3200: 68 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72  he N-th register
3210: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3220: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
3230: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
3240: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
3250: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
3260: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
3270: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
3280: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
3290: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
32a0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
32b0: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
32c0: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
32d0: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
32e0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
32f0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
3300: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
3310: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3320: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
3330: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3340: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
3350: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
3360: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
3370: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3380: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
3390: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
33a0: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
33b0: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
33c0: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
33d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
33e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
33f0: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  K_NULL, 0, 0, 0)
3400: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30  ;.  }.  if( v==0
3410: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3420: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
3430: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
3440: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
3450: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
3460: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
3470: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65   /* Malloc faile
3480: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54  d */.  }.  p->iT
3490: 61 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61  able = atoi((cha
34a0: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
34b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
34c0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
34d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
34e0: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
34f0: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
3500: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
3510: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
3520: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
3530: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
3540: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3550: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
3560: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
3570: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
3580: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
3590: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
35a0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
35b0: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
35c0: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
35d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
35e0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  n sqlite3Expr(db
35f0: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
3600: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
3610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
3620: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
3630: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
3640: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
3650: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
3660: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
3670: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
3680: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
3690: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
36a0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
36b0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
36c0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
36d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36e0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
36f0: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
3700: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
3710: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3720: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
3730: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
3740: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
3750: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
3760: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
3770: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
3780: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
3790: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
37a0: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
37b0: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
37c0: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
37d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37e0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
37f0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
3800: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
3810: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
3820: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
3830: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
3840: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
3850: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3860: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
3870: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3880: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
3890: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
38a0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
38b0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
38c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
38d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
38e0: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
38f0: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
3900: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
3910: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3920: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
3930: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
3940: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
3950: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
3960: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
3970: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
3980: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
3990: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
39a0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
39b0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
39c0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
39d0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
39e0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
39f0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
3a00: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e 65  ight(pParse, pNe
3a10: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
3a20: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
3a30: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
3a40: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
3a50: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
3a60: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
3a70: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
3a80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
3a90: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
3aa0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
3ab0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
3ac0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
3ad0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
3ae0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
3af0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
3b00: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
3b10: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
3b20: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
3b30: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
3b40: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
3b50: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
3b60: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
3b70: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
3b80: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
3b90: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
3ba0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
3bb0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
3bc0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
3bd0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
3be0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
3bf0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
3c00: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
3c10: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
3c20: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
3c30: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
3c40: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
3c50: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
3c60: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
3c70: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
3c80: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
3c90: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
3ca0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
3cb0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
3cc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3cd0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
3ce0: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 73 71  en *pToken;.  sq
3cf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3d00: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
3d10: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
3d20: 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45  ;.  pToken = &pE
3d30: 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73  xpr->token;.  as
3d40: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e  sert( pToken->n>
3d50: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
3d60: 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a  pToken->z!=0 );.
3d70: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
3d80: 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69  ->z[0]!=0 );.  i
3d90: 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20  f( pToken->n==1 
3da0: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
3db0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
3dc0: 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20  ?".  Assign the 
3dd0: 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75  next variable nu
3de0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45 78 70  mber */.    pExp
3df0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
3e00: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65  arse->nVar;.  }e
3e10: 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e  lse if( pToken->
3e20: 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  z[0]=='?' ){.   
3e30: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
3e40: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e  the form "?nnn".
3e50: 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20    Convert "nnn" 
3e60: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
3e70: 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20  d.    ** use it 
3e80: 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  as the variable 
3e90: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e  number */.    in
3ea0: 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  t i;.    pExpr->
3eb0: 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f  iTable = i = ato
3ec0: 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e  i((char*)&pToken
3ed0: 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 74 65 73  ->z[1]);.    tes
3ee0: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
3ef0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
3f00: 31 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  1 );.    testcas
3f10: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
3f20: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
3f30: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
3f40: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
3f50: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
3f60: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
3f70: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 3b  IABLE_NUMBER] );
3f80: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
3f90: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
3fa0: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
3fb0: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
3fc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
3fe0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
3ff0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4000: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4010: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53      db->aLimit[S
4020: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
4030: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a 20  ABLE_NUMBER]);. 
4040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
4050: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
4060: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
4070: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
4080: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
4090: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
40a0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
40b0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
40c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
40d0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
40e0: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
40f0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
4100: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
4110: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
4120: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
4130: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
4140: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
4150: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
4160: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
4170: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
4180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
4190: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
41a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
41b0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
41c0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
41d0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
41e0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
41f0: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
4200: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
4210: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
4220: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
4230: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
4240: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
4250: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
4260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4270: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
4280: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
4290: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
42a0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
42b0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
42c0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
42d0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
42e0: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
42f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
4300: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
4310: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
4320: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
4330: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
4340: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  pr =.           
4350: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
4360: 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20 20  cOrFree(.       
4370: 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
4380: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
4390: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
43a0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
43b0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
43c0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
43d0: 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20 20  pVarExpr[0]).   
43e0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
43f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 64    }.      if( !d
4400: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4410: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4420: 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72  t( pParse->apVar
4430: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
4440: 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72     pParse->apVar
4450: 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61  Expr[pParse->nVa
4460: 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72  rExpr++] = pExpr
4470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4480: 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61 72    } .  if( !pPar
4490: 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61 72  se->nErr && pPar
44a0: 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69  se->nVar>db->aLi
44b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
44c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
44d0: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
44e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
44f0: 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76   "too many SQL v
4500: 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a  ariables");.  }.
4510: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
4520: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
4530: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
4540: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
4550: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
4560: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
4570: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
4580: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
4590: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
45a0: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
45b0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
45c0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28  ) sqlite3_free((
45d0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
45e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
45f0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
4600: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
4610: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
4620: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
4630: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
4640: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
4650: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
4660: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
4670: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
4680: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
4690: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
46a0: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
46b0: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
46c0: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
46d0: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
46e0: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
46f0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
4700: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
4710: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
4720: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
4730: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
4740: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
4750: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
4760: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
4770: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
4780: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
4790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
47a0: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 2d 3e  kenCopy(db, &p->
47b0: 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e  token, &p->token
47c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
47d0: 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70  Dequote((char*)p
47e0: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a  ->token.z);.}...
47f0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4800: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
4810: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
4820: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
4830: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
4840: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
4850: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
4860: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
4870: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
4880: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
4890: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
48a0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
48b0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
48c0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
48d0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
48e0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
48f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
4900: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
4910: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
4920: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
4930: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
4940: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
4950: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
4960: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
4970: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
4980: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
4990: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
49a0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
49b0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
49c0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
49d0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
49e0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
49f0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
4a00: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
4a10: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
4a20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
4a30: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
4a40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4a50: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
4a60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4a70: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
4a80: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
4a90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4aa0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
4ab0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
4ac0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
4ad0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  z!=0 ){.    pNew
4ae0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a  ->token.z = (u8*
4af0: 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75  )sqlite3DbStrNDu
4b00: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
4b10: 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65  token.z, p->toke
4b20: 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n.n);.    pNew->
4b30: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  token.dyn = 1;. 
4b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
4b50: 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e  rt( pNew->token.
4b60: 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e  z==0 );.  }.  pN
4b70: 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  ew->span.z = 0;.
4b80: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
4b90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4ba0: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
4bb0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
4bc0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
4bd0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
4be0: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
4bf0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4c00: 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  (db, p->pList);.
4c10: 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20    pNew->pSelect 
4c20: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
4c30: 75 70 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63  up(db, p->pSelec
4c40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
4c50: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
4c60: 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71 6c 69 74  3TokenCopy(sqlit
4c70: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4c80: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
4c90: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
4ca0: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
4cb0: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
4cc0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
4cd0: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
4ce0: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
4cf0: 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69  o->z = (u8*)sqli
4d00: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
4d10: 20 28 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a   (char*)pFrom->z
4d20: 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20  , pFrom->n);.   
4d30: 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20   pTo->dyn = 1;. 
4d40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d   }else{.    pTo-
4d50: 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78  >z = 0;.  }.}.Ex
4d60: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4d70: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
4d80: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
4d90: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
4da0: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
4db0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4dc0: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
4dd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
4de0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
4df0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
4e00: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
4e10: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
4e20: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
4e30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4e40: 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  New->iECursor = 
4e50: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
4e60: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4e70: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
4e80: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
4e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
4ea0: 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45 78 70 72  aw(db,  p->nExpr
4eb0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
4ec0: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
4ed0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4ee0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
4ef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
4f00: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
4f10: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
4f20: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
4f30: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
4f40: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
4f50: 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45  pNewExpr, *pOldE
4f60: 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  xpr;.    pItem->
4f70: 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72  pExpr = pNewExpr
4f80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4f90: 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 20 3d  p(db, pOldExpr =
4fa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
4fb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
4fc0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
4fd0: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
4fe0: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
4ff0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
5000: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
5010: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
5020: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
5030: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5040: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
5050: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
5060: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
5070: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
5080: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
5090: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
50a0: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
50b0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
50c0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
50d0: 79 28 64 62 2c 20 26 70 4e 65 77 45 78 70 72 2d  y(db, &pNewExpr-
50e0: 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72  >span, &pOldExpr
50f0: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->span);.    }. 
5100: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45     assert( pNewE
5110: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78  xpr==0 || pNewEx
5120: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20  pr->span.z!=0 . 
5130: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f             || pO
5140: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d  ldExpr->span.z==
5150: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
5160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5170: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
5180: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5190: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
51a0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
51b0: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
51c0: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
51d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
51e0: 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c  tem->isAgg = pOl
51f0: 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20  dItem->isAgg;.  
5200: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
5210: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5220: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
5230: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
5240: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
5250: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
5260: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
5270: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
5280: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
5290: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
52a0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
52b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
52c0: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
52d0: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
52e0: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
52f0: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
5300: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
5310: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
5320: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5330: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
5340: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5350: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
5360: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5370: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
5380: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
5390: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
53a0: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 29 7b  db, SrcList *p){
53b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
53c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
53d0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
53e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
53f0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
5400: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
5410: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
5420: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
5430: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
5440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
5450: 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  aw(db, nByte );.
5460: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
5470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
5480: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
5490: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
54a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
54b0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
54c0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
54d0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
54e0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
54f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5500: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
5510: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
5520: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
5530: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
5540: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62  base = sqlite3Db
5550: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
5560: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
5570: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
5580: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5590: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
55a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
55b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
55c0: 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  s = sqlite3DbStr
55d0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
55e0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
55f0: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
5600: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
5610: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
5620: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
5630: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
5640: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
5650: 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 70  >isPopulated = p
5660: 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  OldItem->isPopul
5670: 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62 20 3d  ated;.    pTab =
5680: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
5690: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
56a0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
56b0: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
56c0: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
56d0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
56e0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
56f0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
5700: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
5710: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
5720: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5730: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  db, pOldItem->pO
5740: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  n);.    pNewItem
5750: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
5760: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
5770: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
5780: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
5790: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
57a0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
57b0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
57c0: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
57d0: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
57e0: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
57f0: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
5800: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
5810: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5820: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
5830: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
5840: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
5850: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
5860: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5870: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
5880: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
5890: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
58a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
58b0: 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  Raw(db, p->nId*s
58c0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
58d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
58e0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
58f0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
5900: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5920: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
5930: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
5940: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
5950: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
5960: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
5970: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
5980: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
5990: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
59a0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
59b0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
59c0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
59d0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
59e0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
59f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
5a00: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
5a10: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
5a20: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
5a30: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
5a40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5a50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
5a60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
5a70: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  (db, sizeof(*p) 
5a80: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
5a90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
5aa0: 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  New->isDistinct 
5ab0: 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
5ac0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
5ad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ae0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
5af0: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
5b00: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
5b10: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
5b20: 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  c);.  pNew->pWhe
5b30: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
5b40: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
5b50: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
5b60: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
5b70: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
5b80: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e  >pGroupBy);.  pN
5b90: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  ew->pHaving = sq
5ba0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
5bb0: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
5bc0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
5bd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5be0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
5bf0: 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rBy);.  pNew->op
5c00: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
5c10: 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  ->pPrior = sqlit
5c20: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
5c30: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
5c40: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
5c50: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5c60: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e  p->pLimit);.  pN
5c70: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71  ew->pOffset = sq
5c80: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
5c90: 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
5ca0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
5cb0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
5cc0: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
5cd0: 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d  >isResolved = p-
5ce0: 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70  >isResolved;.  p
5cf0: 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  New->isAgg = p->
5d00: 69 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75  isAgg;.  pNew->u
5d10: 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70  sesEphm = 0;.  p
5d20: 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64  New->disallowOrd
5d30: 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  erBy = 0;.  pNew
5d40: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
5d50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
5d60: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
5d70: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
5d80: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
5d90: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
5da0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65  hm[2] = -1;.  re
5db0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
5dc0: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
5dd0: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
5de0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
5df0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
5e00: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
5e10: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
5e20: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
5e30: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
5e40: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5e50: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
5e60: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
5e70: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
5e80: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
5e90: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
5ea0: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
5eb0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
5ec0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
5ee0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5ef0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5f00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
5f10: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
5f20: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
5f30: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
5f40: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
5f50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
5f60: 20 62 65 20 61 70 70 65 6e 64 65 64 20 2a 2f 0a   be appended */.
5f70: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20    Token *pName  
5f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 53 20            /* AS 
5f90: 6b 65 79 77 6f 72 64 20 66 6f 72 20 74 68 65 20  keyword for the 
5fa0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
5fb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5fc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
5fd0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
5fe0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5ff0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6000: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
6010: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
6020: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
6030: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
6040: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
6050: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
6060: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
6070: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
6080: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
6090: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
60a0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e  _item *a;.    in
60b0: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  t n = pList->nAl
60c0: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61  loc*2 + 4;.    a
60d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
60e0: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
60f0: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
6100: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
6110: 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
6120: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
6130: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20   }.    pList->a 
6140: 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = a;.    pList->
6150: 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a  nAlloc = n;.  }.
6160: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
6170: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
6180: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
6190: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
61a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
61b0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
61c0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
61d0: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
61e0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
61f0: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  ));.    pItem->z
6200: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
6210: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
6220: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  pName);.    pIte
6230: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
6240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6250: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
6260: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
6270: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
6280: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
6290: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
62a0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
62b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
62c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
62d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
62e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
62f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 70  xpression list p
6300: 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d  EList contains m
6310: 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69 74 20  ore than iLimit 
6320: 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61  elements,.** lea
6330: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6340: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
6350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
6360: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
6370: 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  h(.  Parse *pPar
6380: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
6390: 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20  pEList,.  const 
63a0: 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b  char *zObject.){
63b0: 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50 61 72  .  int mx = pPar
63c0: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
63d0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
63e0: 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  MN];.  testcase(
63f0: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
6400: 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a  t->nExpr==mx );.
6410: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
6420: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
6430: 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69  xpr==mx+1 );.  i
6440: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
6450: 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b  ist->nExpr>mx ){
6460: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6470: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
6480: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
6490: 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b  n %s", zObject);
64a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
64b0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65  lete an entire e
64c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
64d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
64e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78  xprListDelete(Ex
64f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
6500: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
6510: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
6520: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
6530: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
6540: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
6550: 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74  ->a!=0 || (pList
6560: 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c  ->nExpr==0 && pL
6570: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20  ist->nAlloc==0) 
6580: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
6590: 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74  st->nExpr<=pList
65a0: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f  ->nAlloc );.  fo
65b0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
65c0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
65d0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
65e0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
65f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
6600: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
6610: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
6620: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  m->zName);.  }. 
6630: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
6640: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
6650: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a  e3_free(pList);.
6660: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
6670: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6680: 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f  .  Call xFunc fo
6690: 72 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69  r each node visi
66a0: 74 65 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69  ted.  xFunc.** i
66b0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
66c0: 6e 6f 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e  node before xFun
66d0: 63 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  c is called on t
66e0: 68 65 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65  he nodes childre
66f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  n..**.** The ret
6700: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
6710: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
6720: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
6730: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
6740: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
6750: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
6760: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
6770: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
6780: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
6790: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
67a0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
67b0: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
67c0: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
67d0: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
67e0: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
67f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
6800: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
6810: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
6820: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
6830: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
6840: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
6850: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
6860: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
6870: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
6880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
6890: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
68a0: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
68b0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
68c0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
68d0: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
68e0: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
68f0: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
6900: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
6910: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
6920: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
6930: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
6940: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
6950: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
6960: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
6970: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
6980: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
6990: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
69a0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
69b0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
69c0: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
69d0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
69e0: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
69f0: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
6a00: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
6a10: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
6a20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
6a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
6a40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
6a50: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
6a60: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
6a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
6a80: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
6a90: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
6aa0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
6ab0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
6ac0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
6ad0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
6ae0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
6af0: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
6b00: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
6b10: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
6b20: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
6b30: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
6b40: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
6b50: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
6b60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
6b70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6b80: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
6b90: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
6ba0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
6bb0: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
6bc0: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
6bd0: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
6be0: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
6bf0: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
6c00: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
6c10: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
6c20: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
6c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
6c40: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
6c50: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
6c60: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
6c70: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
6c80: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
6c90: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
6ca0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
6cb0: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
6cc0: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
6cd0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
6ce0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
6cf0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
6d00: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
6d10: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
6d20: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
6d30: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
6d40: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
6d50: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
6d60: 7b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  {.    walkSelect
6d70: 45 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  Expr(p->pPrior, 
6d80: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6d90: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6da0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6db0: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
6dc0: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
6dd0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
6de0: 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72  .**.** pArg is r
6df0: 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
6e00: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
6e10: 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62  If we can tell b
6e20: 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20  y looking.** at 
6e30: 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65  pExpr that the e
6e40: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
6e50: 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73  ontains pExpr is
6e60: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a   not a constant.
6e70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ** expression, t
6e80: 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f  hen set *pArg to
6e90: 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20   0 and return 2 
6ea0: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
6eb0: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20  ree walk..** If 
6ec0: 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20  pExpr does does 
6ed0: 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74  not disqualify t
6ee0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  he expression fr
6ef0: 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74  om being a const
6f00: 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e  ant.** then do n
6f10: 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  othing..**.** Af
6f20: 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  ter walking the 
6f30: 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e  whole tree, if n
6f40: 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e  o nodes are foun
6f50: 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66  d that disqualif
6f60: 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  y.** the express
6f70: 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c  ion as constant,
6f80: 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20   then we assume 
6f90: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
6fa0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  sion.** is const
6fb0: 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ant.  See sqlite
6fc0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6fd0: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
6fe0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
6ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
7000: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76  NodeIsConstant(v
7010: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
7020: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a  *pExpr){.  int *
7030: 70 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  pN = (int*)pArg;
7040: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20  ..  /* If *pArg 
7050: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
7060: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
7070: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
7080: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
7090: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
70a0: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
70b0: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
70c0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
70d0: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
70e0: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
70f0: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26    if( (*pN)==3 &
7100: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
7110: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
7120: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
7130: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  *pN = 0;.    ret
7140: 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77  urn 2;.  }..  sw
7150: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
7160: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
7170: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
7180: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
7190: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
71a0: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
71b0: 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67      ** and *pArg
71c0: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
71d0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
71e0: 20 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20     if( (*pN)==2 
71f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
7200: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
7210: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
7220: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
7230: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
7240: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
7250: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
7260: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
7270: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
7280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7290: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
72a0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
72b0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
72c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
72d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
72e0: 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74  ELECT );.      t
72f0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
7300: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
7310: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65  .#endif.      te
7320: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7330: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
7340: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
7350: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
7360: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7370: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
7380: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74  K_DOT );.      t
7390: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
73a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
73b0: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
73c0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
73d0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
73e0: 29 3b 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30  );.      *pN = 0
73f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
7400: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
7410: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
7420: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
7430: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
7440: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
7450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66  .      }.    def
7460: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
7470: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
7480: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
7490: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
74a0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
74b0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
74c0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
74d0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
74e0: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
74f0: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
7500: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
7510: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7520: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
7530: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
7540: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
7550: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
7560: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
7570: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
7580: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
7590: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
75a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
75b0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
75c0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
75d0: 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   1;.  walkExprTr
75e0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
75f0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
7600: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
7610: 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Const;.}../*.** 
7620: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
7630: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
7640: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
7650: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
7660: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
7670: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
7680: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
7690: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
76a0: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
76b0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
76c0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
76d0: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
76e0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
76f0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
7700: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7710: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
7720: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
7730: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
7740: 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  3;.  walkExprTre
7750: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
7760: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
7770: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
7780: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
7790: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
77a0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
77b0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
77c0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
77d0: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
77e0: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
77f0: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
7800: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
7810: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
7820: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
7830: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
7840: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
7850: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
7860: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
7870: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
7880: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
7890: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
78a0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
78b0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
78c0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
78d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
78e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
78f0: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
7900: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
7910: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
7920: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
7930: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
7940: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
7950: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
7960: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
7970: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
7980: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
7990: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
79a0: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
79b0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
79c0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
79d0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
79e0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
79f0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
7a00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7a10: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
7a20: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
7a30: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
7a40: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
7a50: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
7a60: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
7a70: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
7a80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7a90: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
7aa0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
7ab0: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
7ac0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7ad0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
7ae0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7af0: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
7b00: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
7b10: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
7b20: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7b50: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
7b60: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
7b70: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7b80: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
7b90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7ba0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
7bb0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
7bc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7bd0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
7be0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
7bf0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
7c00: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
7c30: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
7c40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7c50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7c60: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7c70: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
7c80: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
7c90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
7ca0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
7cb0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
7cc0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
7cd0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
7ce0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7cf0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7d00: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
7d10: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7d20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
7d30: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
7d40: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
7d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7d60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
7d70: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
7d80: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
7d90: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
7da0: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
7db0: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
7dc0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
7dd0: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
7de0: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
7df0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
7e00: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
7e10: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
7e20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
7e30: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
7e40: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
7e50: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
7e60: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7e70: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
7e80: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
7e90: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
7ec0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
7ed0: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
7ee0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
7ef0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7f00: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
7f10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7f20: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
7f30: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
7f40: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
7f50: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7f60: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
7f70: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
7f80: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
7f90: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
7fa0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
7fb0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
7fc0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
7fd0: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
7fe0: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
7ff0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
8000: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
8010: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
8020: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
8030: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8040: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
8050: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
8060: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
8070: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
8080: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
8090: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
80a0: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
80b0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
80c0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
80d0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
80e0: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
80f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
8100: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
8110: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
8120: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
8130: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
8140: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
8150: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
8160: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
8170: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
8180: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
8190: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
81a0: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
81b0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
81c0: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
81d0: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
81e0: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
81f0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
8200: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
8210: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
8220: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
8230: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
8240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
8250: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
8260: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8270: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
8280: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
8290: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
82a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
82b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
82c0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
82d0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
82e0: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
82f0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
8300: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
8310: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
8320: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
8330: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
8340: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
8350: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
8360: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
8370: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
8380: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
8390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
83a0: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
83b0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
83c0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
83d0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
83e0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
83f0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
8400: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
8410: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
8420: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
8430: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
8440: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8450: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
8460: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
8470: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
8480: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
8490: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
84a0: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
84b0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
84c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
84d0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
84e0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
84f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
8500: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
8510: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
8520: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
8530: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
8540: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
8550: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8560: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
8570: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
8580: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
8590: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
85a0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
85b0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
85c0: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
85d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
85e0: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
85f0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
8600: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
8610: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
8620: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
8630: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
8640: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
8650: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53   the list */.  S
8660: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
8670: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8680: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
8690: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
86a0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
86b0: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
86c0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
86d0: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
86e0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
86f0: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
8700: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8710: 62 2c 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20  b, pDbToken);.  
8720: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61  zTab = sqlite3Na
8730: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8740: 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20  pTableToken);.  
8750: 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  zCol = sqlite3Na
8760: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8770: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
8780: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8790: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
87a0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
87b0: 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e  ;.  }..  pExpr->
87c0: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77  iTable = -1;.  w
87d0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74  hile( pNC && cnt
87e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ==0 ){.    ExprL
87f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
8800: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
8810: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
8820: 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  st;..    if( pSr
8830: 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  cList ){.      f
8840: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
8850: 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72  rcList->a; i<pSr
8860: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
8870: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
8880: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8890: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
88a0: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
88b0: 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20   *pCol;.  .     
88c0: 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d     pTab = pItem-
88d0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
88e0: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
88f0: 3b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  ;.        iDb = 
8900: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
8910: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
8920: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
8930: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
8940: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
8950: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
8960: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
8970: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
8980: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8990: 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  abName = pItem->
89a0: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
89b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
89c0: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
89d0: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
89e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
89f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8a00: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
8a10: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
8a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8a30: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
8a40: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
8a50: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
8a60: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
8a70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
8a80: 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  b!=0 && sqlite3S
8a90: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69  trICmp(db->aDb[i
8aa0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  Db].zName, zDb)!
8ab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8ac0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8ad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8af0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  }.        if( 0=
8b00: 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20  =(cntTab++) ){. 
8b10: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8b20: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
8b30: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
8b40: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61     pSchema = pTa
8b50: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
8b60: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
8b70: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
8b80: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
8b90: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
8ba0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
8bb0: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
8bc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
8bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
8be0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
8bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8c10: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
8c20: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
8c30: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
8c40: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
8c50: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
8c60: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8c70: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
8c80: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
8c90: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68              pSch
8cb0: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
8cc0: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ema;.           
8cd0: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
8ce0: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
8cf0: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
8d00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8d10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
8d20: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
8d30: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
8d40: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
8d50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8d60: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
8d70: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8d90: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8da0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8db0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8dc0: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8dd0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8de0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8df0: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8e10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
8e20: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pSrcList->nSrc-1
8e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8e40: 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a    if( pItem[1].j
8e50: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
8e60: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  URAL ){.        
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8e80: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65  is match occurre
8e90: 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  d in the left ta
8ea0: 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c  ble of a natural
8eb0: 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20   join,.         
8ec0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73         ** then s
8ed0: 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74 61  kip the right ta
8ee0: 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64  ble to avoid a d
8ef0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a  uplicate match *
8f00: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8f10: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
8f20: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
8f40: 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67 20  lse if( (pUsing 
8f50: 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e  = pItem[1].pUsin
8f60: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)!=0 ){.       
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
8f80: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
8f90: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
8fa0: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
8fb0: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
8fc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61           ** of a
8fd0: 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20   join, skip the 
8fe0: 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69  search of the ri
8ff0: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ght table of the
9000: 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20   join.          
9010: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
9020: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
9030: 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20  tch there. */.  
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
9050: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
9060: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
9070: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
9080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9090: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90a0: 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e  StrICmp(pUsing->
90b0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  a[k].zName, zCol
90c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
90e0: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
90f0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9120: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9150: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9160: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9170: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9180: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9190: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
91a0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
91b0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
91c0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
91d0: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
91e0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
91f0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
9200: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
9210: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
9220: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
9230: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
9240: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
9250: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
9260: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
9270: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
9280: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
9290: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
92a0: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
92b0: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
92c0: 20 75 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b   u32 *piColMask;
92d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
92e0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
92f0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
9300: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
9310: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
9320: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
9330: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
9340: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
9350: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
9360: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
9370: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
9380: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
9390: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
93a0: 70 69 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54  piColMask = &(pT
93b0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
93c0: 43 6f 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ColMask);.      
93d0: 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67  }else if( pTrigg
93e0: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20  erStack->oldIdx 
93f0: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
9400: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a  StrICmp("old", z
9410: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
9420: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9430: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
9440: 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20  ->oldIdx;.      
9450: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
9460: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
9470: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
9480: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
9490: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43  Tab;.        piC
94a0: 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67  olMask = &(pTrig
94b0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c  gerStack->oldCol
94c0: 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Mask);.      }..
94d0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
94e0: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
94f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Col;.        Col
9500: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
9510: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
9520: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
9530: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
9540: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
9550: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9560: 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  iCol < pTab->nCo
9570: 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b  l; iCol++, pCol+
9580: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  +) {.          i
9590: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
95a0: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
95b0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
95c0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
95d0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r *zColl = pTab-
95e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c  >aCol[iCol].zCol
95f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  l;.            c
9600: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
9610: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
9620: 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69   = iCol==pTab->i
9630: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c  PKey ? -1 : iCol
9640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
9650: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
9660: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9670: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
9680: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
9690: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
96a0: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
96c0: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
96d0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
96e0: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
96f0: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
9700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9710: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
9720: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
9730: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
9740: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9750: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
9760: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
9770: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9780: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
9790: 20 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c            *piCol
97a0: 4d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c  Mask |= ((u32)1<
97b0: 3c 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d  <iCol) | (iCol>=
97c0: 33 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29  32?0xffffffff:0)
97d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
97f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9810: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
9820: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9830: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
9840: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
9850: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
9860: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
9870: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
9880: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
9890: 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31  ==0 && cntTab==1
98a0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
98b0: 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20  id(zCol) ){.    
98c0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
98d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
98e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
98f0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
9900: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
9920: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
9930: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
9940: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
9950: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
9960: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
9970: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
9980: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
9990: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
99a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
99b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
99c0: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
99d0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
99e0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
99f0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
9a00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
9a10: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
9a20: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
9a30: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
9a40: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
9a50: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
9a60: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
9a70: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
9a80: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
9a90: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
9aa0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
9ab0: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
9ac0: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
9ad0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
9ae0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
9af0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
9b00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
9b10: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
9b20: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
9b30: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
9b40: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
9b50: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
9b60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9b70: 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69   cnt==0 && (pELi
9b80: 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
9b90: 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  )!=0 && zTab==0 
9ba0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
9bb0: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
9bc0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
9bd0: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
9be0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
9bf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
9c00: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
9c10: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
9c20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9c30: 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f   Expr *pDup, *pO
9c40: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
9c50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
9c60: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
9c70: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
9c80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c90: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
9ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
9cb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c  ert( pExpr->pSel
9cc0: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
9cd0: 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69      pOrig = pELi
9ce0: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a  st->a[j].pExpr;.
9cf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
9d00: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20  NC->allowAgg && 
9d10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9d20: 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29  pOrig, EP_Agg) )
9d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
9d40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9d50: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
9d60: 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 61   aliased aggrega
9d70: 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20  te %s", zAs);.  
9d80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9d90: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
9da0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9db0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   2;.          }.
9dc0: 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d            pDup =
9dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9de0: 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20  db, pOrig);.    
9df0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9e00: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
9e10: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
9e20: 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c        pDup->pCol
9e30: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
9e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  ;.            pD
9e50: 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  up->flags |= EP_
9e60: 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
9e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61    if( pExpr->spa
9e90: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
9ea0: 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78 70  free((char*)pExp
9eb0: 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20  r->span.z);.    
9ec0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9ed0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  >token.dyn ) sql
9ee0: 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a  ite3_free((char*
9ef0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  )pExpr->token.z)
9f00: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
9f10: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
9f20: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
9f30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9f40: 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20  e3_free(pDup);. 
9f50: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
9f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
9f70: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
9f80: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
9f90: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
9fa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
9fb0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
9fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9fd0: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
9fe0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
9ff0: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
a000: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
a010: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
a020: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
a030: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
a040: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
a050: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
a060: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
a070: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
a080: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
a090: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
a0a0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
a0b0: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
a0c0: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
a0d0: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
a0e0: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
a0f0: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
a100: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
a110: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
a120: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
a130: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
a140: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
a150: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
a160: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
a170: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
a180: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
a190: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
a1a0: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
a1b0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
a1c0: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
a1d0: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
a1e0: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
a1f0: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
a200: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
a210: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
a220: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
a230: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
a240: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
a250: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
a260: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
a270: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
a280: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
a290: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
a2a0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  0;.  }..  /*.  *
a2b0: 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74  * cnt==0 means t
a2c0: 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74  here was not mat
a2d0: 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73  ch.  cnt>1 means
a2e0: 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20   there were two 
a2f0: 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74  or.  ** more mat
a300: 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61  ches.  Either wa
a310: 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72  y, we have an er
a320: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
a330: 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f  cnt!=1 ){.    co
a340: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
a350: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
a360: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
a370: 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75  umn" : "ambiguou
a380: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a  s column name";.
a390: 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20      if( zDb ){. 
a3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a3b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
a3c0: 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72  : %s.%s.%s", zEr
a3d0: 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43  r, zDb, zTab, zC
a3e0: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ol);.    }else i
a3f0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
a400: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a410: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
a420: 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62  .%s", zErr, zTab
a430: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
a440: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
a450: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a460: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72  , "%s: %s", zErr
a470: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
a480: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
a490: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
a4a0: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
a4b0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
a4c0: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
a4d0: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
a4e0: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
a4f0: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
a500: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
a510: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
a520: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
a530: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
a540: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
a550: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
a560: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
a570: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
a580: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
a590: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
a5a0: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
a5b0: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
a5c0: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
a5d0: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
a5e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
a5f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
a600: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
a610: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
a620: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
a630: 28 20 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n==sizeof(Bitm
a640: 61 73 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20  ask)*8-1 );.    
a650: 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69  if( n>=sizeof(Bi
a660: 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20  tmask)*8 ){.    
a670: 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74    n = sizeof(Bit
a680: 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d  mask)*8-1;.    }
a690: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61  .    assert( pMa
a6a0: 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45  tch->iCursor==pE
a6b0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a6c0: 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73     pMatch->colUs
a6d0: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
a6e0: 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b  1)<<n;.  }..look
a6f0: 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a  upname_end:.  /*
a700: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
a710: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
a720: 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20  te3_free(zDb);. 
a730: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
a740: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
a750: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
a760: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
a770: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
a780: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a790: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
a7a0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
a7b0: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
a7c0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
a7d0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
a7e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a7f0: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d  Col);.  if( cnt=
a800: 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =1 ){.    assert
a810: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  ( pNC!=0 );.    
a820: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
a830: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
a840: 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72  Schema, pNC->pSr
a850: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
a860: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
a870: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
a880: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
a890: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
a8a0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
a8b0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
a8c0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
a8d0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
a8e0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
a8f0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
a900: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
a910: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
a920: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
a930: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
a940: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
a950: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
a960: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
a970: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
a980: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
a990: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
a9a0: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
a9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
a9c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
a9d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
a9e0: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
a9f0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
aa00: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
aa10: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
aa20: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
aa30: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
aa40: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
aa50: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
aa60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
aa70: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
aa80: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
aa90: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
aaa0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
aab0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
aac0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
aad0: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
aae0: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
aaf0: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
ab00: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
ab10: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
ab20: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
ab30: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
ab40: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
ab50: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
ab60: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
ab70: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
ab80: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
ab90: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
aba0: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
abb0: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61  text*)pArg;.  Pa
abc0: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
abd0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
abe0: 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72  eturn 1;.  asser
abf0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
ac00: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
ac10: 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  rse;..  if( Expr
ac20: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
ac30: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
ac40: 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  d) ) return 1;. 
ac50: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
ac60: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
ac70: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
ac80: 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e  EBUG.  if( pNC->
ac90: 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d  pSrcList && pNC-
aca0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >pSrcList->nAllo
acb0: 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  c>0 ){.    SrcLi
acc0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
acd0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
ace0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
acf0: 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72  (i=0; i<pNC->pSr
ad00: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
ad10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
ad20: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
ad30: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
ad40: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
ad50: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
ad60: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
ad70: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
ad80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ad90: 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64  /* Double-quoted
ada0: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61   strings (ex: "a
adb0: 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73  bc") are used as
adc0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a   identifiers if.
add0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
ade0: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79    Otherwise they
adf0: 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e   remain as strin
ae00: 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74  gs.  Single-quot
ae10: 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ed.    ** string
ae20: 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72  s (ex: 'abc') ar
ae30: 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20  e always string 
ae40: 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f  literals..    */
ae50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
ae60: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
ae70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
ae80: 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b  0]=='\'' ) break
ae90: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
aea0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
aeb0: 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73  _ID case if this
aec0: 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f   is a double-quo
aed0: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ted string */.  
aee0: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e    }.    /* A lon
aef0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
af00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
af10: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
af20: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
af30: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
af40: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
af50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
af60: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
af70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
af80: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
af90: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
afa0: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
afb0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
afc0: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
afd0: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
afe0: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
aff0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
b000: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
b010: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
b020: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
b030: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
b040: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
b050: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
b060: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
b070: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
b080: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
b090: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
b0a0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
b0b0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
b0c0: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
b0d0: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
b0e0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
b0f0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
b100: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
b110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b120: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
b130: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
b140: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
b150: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
b160: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
b170: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
b180: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
b190: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
b1a0: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
b1b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
b1c0: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
b1d0: 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c  arse, pDb, pTabl
b1e0: 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, pColumn, pNC,
b1f0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
b200: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
b210: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
b220: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
b230: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
b240: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
b250: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
b260: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
b270: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b280: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
b290: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
b2a0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
b2b0: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
b2c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
b2d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
b2e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
b2f0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
b300: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
b310: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
b320: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
b330: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
b340: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
b350: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
b360: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
b370: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
b380: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b3a0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
b3b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b3c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
b3d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b  .      int auth;
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
b400: 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66  ion to use the f
b410: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b420: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b440: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
b450: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
b460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
b470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
b480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b490: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
b4a0: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
b4b0: 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
b4c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
b4d0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
b4e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
b4f0: 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70   int enc = ENC(p
b500: 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20  Parse->db);  /* 
b510: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
b520: 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20  oding */..      
b530: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
b540: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
b550: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
b560: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
b570: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
b580: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
b590: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
b5a0: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
b5b0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
b5c0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
b5d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
b5e0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
b5f0: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
b600: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
b610: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
b620: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
b630: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
b640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b650: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
b660: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
b670: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b680: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
b690: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
b6a0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
b6b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
b6c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  RIZATION.      i
b6d0: 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20  f( pDef ){.     
b6e0: 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65     auth = sqlite
b6f0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
b700: 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e, SQLITE_FUNCTI
b710: 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61  ON, 0, pDef->zNa
b720: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
b730: 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45  if( auth!=SQLITE
b740: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
b750: 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54   if( auth==SQLIT
b760: 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20  E_DENY ){.      
b770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b780: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
b790: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f  ot authorized to
b7a0: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25   use function: %
b7b0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e          pDef->zN
b7e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b7f0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
b800: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b810: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
b820: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
b830: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b850: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
b860: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
b870: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
b880: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b890: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
b8a0: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
b8b0: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
b8c0: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
b8d0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
b8e0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
b8f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
b900: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
b910: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
b920: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b930: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
b940: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
b950: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
b960: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
b970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b980: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
b990: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b9a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b9b0: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
b9c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
b9d0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
b9e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
b9f0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
ba00: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
ba10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ba20: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
ba30: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
ba40: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
ba50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
ba60: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
ba70: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
ba80: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
ba90: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  g = 0;.      for
baa0: 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d  (i=0; pNC->nErr=
bab0: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
bac0: 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70  .        walkExp
bad0: 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  rTree(pList->a[i
bae0: 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73  ].pExpr, nameRes
baf0: 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b  olverStep, pNC);
bb00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bb10: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
bb20: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  >allowAgg = 1;. 
bb30: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
bb40: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
bb50: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
bb60: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
bb70: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
bb80: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
bb90: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
bba0: 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67      return is_ag
bbb0: 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  g;.    }.#ifndef
bbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
bbd0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
bbe0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
bbf0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
bc00: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
bc10: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
bc20: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
bc30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
bc40: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
bc50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc60: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20  OMIT_CHECK.     
bc70: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
bc80: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eck ){.         
bc90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bca0: 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72  (pParse,"subquer
bcb0: 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ies prohibited i
bcc0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
bcd0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  nts");.        }
bce0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
bcf0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
bd00: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78  olve(pParse, pEx
bd10: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43  pr->pSelect, pNC
bd20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
bd30: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
bd40: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
bd50: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
bd60: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
bd70: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
bd80: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
bd90: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
bda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
bdb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
bdc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
bdd0: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
bde0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
bdf0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
be00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
be10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
be20: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
be30: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
be40: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
be50: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
be60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
be70: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
be80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
be90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
bea0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
beb0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
bec0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
bed0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
bee0: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
bef0: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
bf00: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
bf10: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
bf20: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
bf30: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
bf40: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
bf50: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
bf60: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
bf70: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
bf80: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
bf90: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
bfa0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
bfb0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
bfc0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
bfd0: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
bfe0: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
bff0: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
c000: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
c010: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
c020: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
c030: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
c040: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
c050: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
c060: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
c070: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
c080: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
c090: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
c0a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
c0b0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
c0c0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
c0d0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
c0e0: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
c0f0: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
c100: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
c110: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
c120: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
c130: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
c140: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
c150: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  WID..**.** Also 
c160: 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  resolve function
c170: 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b   names and check
c180: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66   the functions f
c190: 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61  or proper.** usa
c1a0: 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  ge.  Make sure a
c1b0: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ll function name
c1c0: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
c1d0: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
c1e0: 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63  ns.** have the c
c1f0: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
c200: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
c210: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
c220: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
c230: 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79  ->zErrMsg if any
c240: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
c250: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
c260: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
c270: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
c280: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
c290: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
c2a0: 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ns then set the 
c2b0: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
c2c0: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
c2d0: 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sion..*/.int sql
c2e0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
c2f0: 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e  ames( .  NameCon
c300: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
c310: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
c320: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
c330: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
c340: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c360: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
c370: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
c380: 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b  int savedHasAgg;
c390: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
c3a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
c3b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
c3c0: 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20  _DEPTH>0.  {.   
c3d0: 20 69 66 28 20 63 68 65 63 6b 45 78 70 72 48 65   if( checkExprHe
c3e0: 69 67 68 74 28 70 4e 43 2d 3e 70 50 61 72 73 65  ight(pNC->pParse
c3f0: 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  , pExpr->nHeight
c400: 20 2b 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   + pNC->pParse->
c410: 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20  nHeight) ){.    
c420: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c430: 7d 0a 20 20 20 20 70 4e 43 2d 3e 70 50 61 72 73  }.    pNC->pPars
c440: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
c450: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  xpr->nHeight;.  
c460: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64  }.#endif.  saved
c470: 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61  HasAgg = pNC->ha
c480: 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73  sAgg;.  pNC->has
c490: 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45  Agg = 0;.  walkE
c4a0: 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e  xprTree(pExpr, n
c4b0: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
c4c0: 20 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54   pNC);.#if SQLIT
c4d0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
c4e0: 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65  >0.  pNC->pParse
c4f0: 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78  ->nHeight -= pEx
c500: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
c510: 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  dif.  if( pNC->n
c520: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
c530: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
c540: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
c550: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
c560: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
c570: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
c580: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
c590: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
c5a0: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
c5b0: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
c5c0: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
c5d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
c5e0: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
c5f0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
c600: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
c610: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
c620: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
c630: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
c640: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
c650: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
c660: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
c670: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
c680: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
c690: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
c6a0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
c6b0: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
c6c0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
c6d0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
c6e0: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
c6f0: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
c700: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
c710: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53   */.};..#ifdef S
c720: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
c730: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
c740: 69 6e 5f 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73  in_opt = 1;.#els
c750: 65 0a 20 20 23 64 65 66 69 6e 65 20 73 71 6c 69  e.  #define sqli
c760: 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70  te3_enable_in_op
c770: 74 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t 1.#endif../*.*
c780: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
c790: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
c7a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
c7b0: 20 65 6e 61 62 6c 65 64 20 61 6e 64 0a 2a 2a 20   enabled and.** 
c7c0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
c7d0: 6d 65 6e 74 20 70 20 65 78 69 73 74 73 20 61 6e  ment p exists an
c7e0: 64 20 69 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73  d is of the.** s
c7f0: 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  imple form:.**.*
c800: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f  *     SELECT <co
c810: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
c820: 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e>.**.** If this
c830: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74   is the case, it
c840: 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
c850: 20 74 6f 20 75 73 65 20 61 6e 20 65 78 69 73 74   to use an exist
c860: 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 6f 72 20  ing table.** or 
c870: 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
c880: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65   generating an e
c890: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a  pheremal table..
c8a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c8b0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c8c0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
c8d0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
c8e0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
c8f0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
c900: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
c910: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c920: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 65 6e   if( !sqlite3_en
c930: 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 29 20 72 65  able_in_opt ) re
c940: 74 75 72 6e 20 30 3b 20 2f 2a 20 49 4e 20 6f 70  turn 0; /* IN op
c950: 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20  timization must 
c960: 62 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  be enabled */.  
c970: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c980: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c990: 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74 2d         /* right-
c9a0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20  hand side of IN 
c9b0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
c9c0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
c9d0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
c9e0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
c9f0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
ca00: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  /.  if( p->isDis
ca10: 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
ca20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ;          /* No
ca30: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
ca40: 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73  d */.  if( p->is
ca50: 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca70: 20 43 6f 6e 74 61 69 6e 73 20 6e 6f 20 61 67 67   Contains no agg
ca80: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ca90: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72   */.  if( p->pGr
caa0: 6f 75 70 42 79 20 29 20 72 65 74 75 72 6e 20 30  oupBy ) return 0
cab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cac0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
cad0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
cae0: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
caf0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cb00: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
cb10: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  IT clause */.  i
cb20: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 20  f( p->pOffset ) 
cb30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
cb40: 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
cb50: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
cb60: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45     /* Has no WHE
cb70: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70  RE clause */.  p
cb80: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
cb90: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 72   if( pSrc==0 ) r
cba0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cbb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
cbc0: 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
cbd0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
cbe0: 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
cbf0: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
cc00: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
cc10: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
cc20: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
cc30: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
cc40: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
cc50: 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
cc60: 2e 70 54 61 62 3b 0a 20 20 69 66 28 20 70 54 61  .pTab;.  if( pTa
cc70: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
cc80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
cc90: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
cca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
ccb0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
ccc0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
ccd0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
cce0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
ccf0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
cd00: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
cd10: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
cd20: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
cd30: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
cd40: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
cd50: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
cd60: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
cd70: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
cd80: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
cd90: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
cda0: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
cdb0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
cdc0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
cdd0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
cde0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cdf0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
ce00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ce10: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
ce20: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
ce30: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
ce40: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
ce50: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
ce60: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
ce70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
ce80: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
ce90: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
cea0: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
ceb0: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
cec0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
ced0: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
cee0: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
cef0: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
cf00: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
cf10: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
cf20: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
cf30: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
cf40: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
cf50: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
cf60: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
cf70: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
cf80: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
cf90: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
cfa0: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
cfb0: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
cfc0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cfd0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
cfe0: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
cff0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d000: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
d010: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
d020: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
d030: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
d040: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
d050: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
d060: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
d070: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d080: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
d090: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d0b0: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
d0c0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
d0d0: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
d0e0: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
d0f0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
d100: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
d110: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
d120: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
d130: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
d140: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
d150: 68 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  he mustBeUnique 
d160: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
d170: 73 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  se, the structur
d180: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
d190: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
d1a0: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
d1b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
d1c0: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
d1d0: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
d1e0: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
d1f0: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
d200: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
d210: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
d220: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
d230: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
d240: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
d250: 0a 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65  .**.** If mustBe
d260: 55 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20  Unique is true, 
d270: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
d280: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
d290: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
d2a0: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
d2b0: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
d2c0: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
d2d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
d2e0: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
d2f0: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
d300: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
d310: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
d320: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
d330: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
d340: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
d350: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
d360: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
d370: 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76  * is unique by v
d380: 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74  irtue of a const
d390: 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69  raint or implici
d3a0: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e  t index..*/.#ifn
d3b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d3c0: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
d3d0: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
d3e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
d3f0: 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73  xpr *pX, int mus
d400: 74 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65  tBeUnique){.  Se
d410: 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65  lect *p;.  int e
d420: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
d430: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
d440: 54 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  Tab++;..  /* The
d450: 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e   follwing if(...
d460: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ) expression is 
d470: 74 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45  true if the SELE
d480: 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20  CT is of the .  
d490: 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a  ** simple form:.
d4a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
d4b0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
d4c0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a  OM <table>.  **.
d4d0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
d4e0: 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79  the case, it may
d4f0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
d500: 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
d510: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e  table.  ** or in
d520: 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67  dex instead of g
d530: 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68  enerating an eph
d540: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20  eremal table..  
d550: 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 70 53 65  */.  p = pX->pSe
d560: 6c 65 63 74 3b 0a 20 20 69 66 28 20 69 73 43 61  lect;.  if( isCa
d570: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
d580: 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  p) ){.    sqlite
d590: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d5a0: 64 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  db;.    Index *p
d5b0: 49 64 78 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Idx;.    Expr *p
d5c0: 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
d5d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
d5e0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
d5f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
d600: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
d610: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
d620: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
d630: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
d640: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f   called from two
d650: 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68   places. In both
d660: 20 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a   cases the vdbe.
d670: 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
d680: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
d690: 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c  d. So assume sql
d6a0: 69 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73  ite3GetVdbe() is
d6b0: 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73   always.    ** s
d6c0: 75 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a  uccessful here..
d6d0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
d6e0: 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43  t(v);.    if( iC
d6f0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ol<0 ){.      in
d700: 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
d710: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
d720: 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20 20  nt iAddr;.      
d730: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 2d  Table *pTab = p-
d740: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
d750: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  ;.      int iDb 
d760: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
d770: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
d780: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
d790: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
d7a0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 0a  Btree(v, iDb);..
d7b0: 20 20 20 20 20 20 69 41 64 64 72 20 3d 20 73 71        iAddr = sq
d7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d7d0: 76 2c 20 4f 50 5f 49 66 2c 20 69 4d 65 6d 29 3b  v, OP_If, iMem);
d7e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d7f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d800: 6e 74 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29  nteger, 1, iMem)
d810: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
d820: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
d830: 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
d840: 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
d850: 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49  .      eType = I
d860: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a  N_INDEX_ROWID;..
d870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d880: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
d890: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
d8a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
d8b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d8c0: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
d8d0: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
d8e0: 64 65 78 20 69 73 20 74 6f 20 0a 20 20 20 20 20  dex is to .     
d8f0: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
d900: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
d910: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
d920: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
d930: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
d940: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
d950: 71 75 65 6e 63 65 2e 0a 20 20 20 20 20 20 2a 2f  quence..      */
d960: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
d970: 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42 69  pReq = sqlite3Bi
d980: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
d990: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
d9a0: 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20  Left, pExpr);.. 
d9b0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
d9c0: 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  at the affinity 
d9d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
d9e0: 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65  d to perform the
d9f0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61   .      ** compa
da00: 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  rison is the sam
da10: 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69 74  e as the affinit
da20: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  y of the column.
da30: 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   If.      ** it 
da40: 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f  is not, it is no
da50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
da60: 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20  e any index..   
da70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
da80: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
da90: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
daa0: 20 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 63      char aff = c
dab0: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
dac0: 79 28 70 58 29 3b 0a 20 20 20 20 20 20 69 6e 74  y(pX);.      int
dad0: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 28   affinity_ok = (
dae0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
daf0: 2e 61 66 66 69 6e 69 74 79 3d 3d 61 66 66 7c 7c  .affinity==aff||
db00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
db10: 4e 4f 4e 45 29 3b 0a 0a 20 20 20 20 20 20 66 6f  NONE);..      fo
db20: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
db30: 64 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79  dex; pIdx && eTy
db40: 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74  pe==0 && affinit
db50: 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d  y_ok; pIdx=pIdx-
db60: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
db70: 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f   if( (pIdx->aiCo
db80: 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20  lumn[0]==iCol). 
db90: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 65 71          && (pReq
dba0: 3d 3d 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  ==sqlite3FindCol
dbb0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
dbc0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
dbd0: 5d 2c 20 2d 31 2c 20 30 29 29 0a 20 20 20 20 20  ], -1, 0)).     
dbe0: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
dbf0: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
dc00: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49  nColumn==1 && pI
dc10: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
dc20: 4e 6f 6e 65 29 29 0a 20 20 20 20 20 20 20 20 29  None)).        )
dc30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
dc40: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
dc50: 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
dc60: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
dc70: 20 20 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20      int iAddr;. 
dc80: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
dc90: 4b 65 79 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Key;.  .        
dca0: 20 20 70 4b 65 79 20 3d 20 28 63 68 61 72 20 2a    pKey = (char *
dcb0: 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  )sqlite3IndexKey
dcc0: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  info(pParse, pId
dcd0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 44  x);.          iD
dce0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
dcf0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 64  aToIndex(db, pId
dd00: 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  x->pSchema);.   
dd10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd20: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
dd30: 44 62 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  Db);..          
dd40: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  iAddr = sqlite3V
dd50: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
dd60: 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  If, iMem);.     
dd70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
dd90: 65 67 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a  eger, 1, iMem);.
dda0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c    .          sql
ddb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ddc0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
ddd0: 6e 73 2c 20 30 2c 20 70 49 64 78 2d 3e 6e 43 6f  ns, 0, pIdx->nCo
dde0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lumn);.         
ddf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de00: 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p4(v, OP_OpenRea
de10: 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e 74  d, iTab, pIdx->t
de20: 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 20 20 20 20 20 70 4b 65 79 2c 50 34           pKey,P4
de50: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
de60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
de70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
de80: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
de90: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
dea0: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  e = IN_INDEX_IND
deb0: 45 58 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73  EX;..          s
dec0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ded0: 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20  re(v, iAddr);.  
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
def0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
df00: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
df10: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
df20: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
df30: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  );.    eType = I
df40: 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 7d  N_INDEX_EPH;.  }
df50: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
df60: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
df70: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
df80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
df90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
dfa0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
dfb0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
dfc0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
dfd0: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
dfe0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
dff0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
e000: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
e010: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
e020: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
e030: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
e040: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
e050: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
e060: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
e070: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
e080: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
e090: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
e0a0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
e0b0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
e0c0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
e0d0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
e0e0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
e0f0: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
e100: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
e110: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
e120: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
e130: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
e140: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23  r subquery..*/.#
e150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e160: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
e170: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
e180: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
e190: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
e1a0: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
e1b0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1d0: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
e1e0: 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20  dress */.  Vdbe 
e1f0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e200: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e210: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e220: 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  ;...  /* This co
e230: 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  de must be run i
e240: 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65  n its entirety e
e250: 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20  very time it is 
e260: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
e270: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
e280: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
e290: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a  :.  **.  **    *
e2a0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
e2b0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65   side is a corre
e2c0: 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20  lated subquery. 
e2d0: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
e2e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
e2f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e300: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  ist containing v
e310: 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20  ariables.  **   
e320: 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64   *  We are insid
e330: 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  e a trigger.  **
e340: 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  .  ** If all of 
e350: 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61  the above are fa
e360: 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  lse, then we can
e370: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a   run this code j
e380: 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61  ust once.  ** sa
e390: 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20  ve the results, 
e3a0: 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61  and reuse the sa
e3b0: 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  me result on sub
e3c0: 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69  sequent invocati
e3d0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
e3e0: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
e3f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
e400: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
e410: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
e420: 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20  {.    int mem = 
e430: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e450: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
e460: 6d 65 6d 29 3b 0a 20 20 20 20 74 65 73 74 41 64  mem);.    testAd
e470: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e480: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e490: 65 67 65 72 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20  eger, 1, mem);. 
e4a0: 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41     assert( testA
e4b0: 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  ddr>0 || pParse-
e4c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e4d0: 64 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  d );.  }..  swit
e4e0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
e4f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
e500: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66   {.      char af
e510: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65  finity;.      Ke
e520: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20  yInfo keyInfo;. 
e530: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
e540: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e550: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
e560: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
e570: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e   */..      affin
e580: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
e590: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
e5a0: 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  >pLeft);..      
e5b0: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
e5c0: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
e5d0: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
e5e0: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
e5f0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
e600: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
e610: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
e620: 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
e630: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
e640: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
e650: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
e660: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
e670: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
e680: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
e690: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
e6a0: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
e6b0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
e6c0: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
e6d0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
e6e0: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
e6f0: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
e700: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
e710: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
e720: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
e730: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
e740: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
e750: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
e760: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
e770: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
e780: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
e790: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
e7a0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
e7b0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
e7c0: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
e7d0: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
e7e0: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
e7f0: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
e800: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
e810: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
e820: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
e830: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
e840: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
e850: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
e860: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
e870: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
e880: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
e890: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
e8a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e8b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
e8c0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
e8d0: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  r->iTable, 1);. 
e8e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
e8f0: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
e900: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
e910: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
e920: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 1;..      if( 
e930: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
e940: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
e950: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
e960: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
e970: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e980: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
e990: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
e9a0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
e9b0: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
e9c0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
e9d0: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
e9e0: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
e9f0: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
ea00: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
ea10: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
ea20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ea30: 74 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t;..        sqli
ea40: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ea50: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
ea60: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
ea70: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
ea80: 66 66 69 6e 69 74 79 20 3d 20 28 69 6e 74 29 61  ffinity = (int)a
ea90: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
eaa0: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
eab0: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
eac0: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
ead0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  le );.        if
eae0: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  ( sqlite3Select(
eaf0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
eb00: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 30  Select, &dest, 0
eb10: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
eb20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
eb30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb40: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
eb50: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
eb60: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
eb70: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
eb80: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
eb90: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
eba0: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
ebb0: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
ebc0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
ebd0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
ebe0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
ebf0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
ec00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ec10: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ec20: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
ec30: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
ec40: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
ec50: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
ec60: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
ec70: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
ec80: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
ec90: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
eca0: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
ecb0: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
ecc0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
ecd0: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
ece0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
ecf0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
ed00: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
ed10: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
ed20: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
ed30: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
ed40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
ed50: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
ed60: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
ed70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
ed80: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
ed90: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
eda0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
edb0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
edc0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
edd0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
ede0: 31 2c 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  1, r2;..        
edf0: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
ee00: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
ee10: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
ee20: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
ee30: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
ee40: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70  .aColl[0] = pExp
ee50: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b  r->pLeft->pColl;
ee60: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
ee70: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
ee80: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
ee90: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
eea0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
eeb0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
eec0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  e);.        r2 =
eed0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
eee0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
eef0: 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
ef00: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
ef10: 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
ef20: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
ef30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
ef40: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
ef50: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
ef60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ef70: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
ef80: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
ef90: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
efa0: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
efb0: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
efc0: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
efd0: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
efe0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
eff0: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
f000: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
f010: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
f020: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
f030: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
f040: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
f050: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
f060: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
f070: 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74          if( test
f080: 41 64 64 72 20 26 26 20 21 73 71 6c 69 74 65 33  Addr && !sqlite3
f090: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
f0a0: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
f0b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f0c0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65  angeToNoop(v, te
f0d0: 73 74 41 64 64 72 2d 31 2c 20 32 29 3b 0a 20 20  stAddr-1, 2);.  
f0e0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
f0f0: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
f100: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
f110: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
f120: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
f130: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
f140: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
f150: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
f160: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
f170: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
f180: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f190: 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
f1a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
f1b0: 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
f1c0: 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20  eColCache>0 );. 
f1d0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
f1e0: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
f1f0: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  --;.          sq
f200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
f210: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
f220: 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r1, 1, r2, &af
f230: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
f240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f250: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
f260: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
f270: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
f280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f290: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
f2a0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
f2b0: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r2);.        }.
f2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
f2d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f2e0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f2f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f300: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f310: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
f320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f330: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
f340: 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66   (void *)&keyInf
f350: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
f360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f370: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
f380: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
f390: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
f3a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
f3b0: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
f3c0: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
f3d0: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
f3e0: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
f3f0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
f400: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
f410: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
f420: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
f430: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
f440: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
f450: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
f460: 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  tic const Token 
f470: 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22  one = { (u8*)"1"
f480: 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20  , 0, 1 };.      
f490: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
f4a0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
f4b0: 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 53 65 6c  est;..      pSel
f4c0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
f4d0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f4e0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f4f0: 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73  dest, 0, ++pPars
f500: 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  e->nMem);.      
f510: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f520: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
f530: 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
f540: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
f550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f560: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
f570: 30 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a  0, dest.iParm);.
f580: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
f590: 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75  ent((v, "Init su
f5a0: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
f5b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f5c0: 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73         dest.eDes
f5d0: 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  t = SRT_Exists;.
f5e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f5f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f600: 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74  Integer, 0, dest
f610: 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  .iParm);.       
f620: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f630: 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
f640: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
f650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f660: 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  prDelete(pSel->p
f670: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
f680: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
f690: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
f6a0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
f6b0: 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20   0, &one);.     
f6c0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
f6d0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
f6e0: 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c   &dest, 0, 0, 0,
f6f0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72   0) ){.        r
f700: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
f710: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
f720: 75 6d 6e 20 3d 20 64 65 73 74 2e 69 50 61 72 6d  umn = dest.iParm
f730: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f740: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f750: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
f760: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f770: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 2d  ere(v, testAddr-
f780: 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  1);.  }..  retur
f790: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
f7a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
f7b0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75  ERY */../*.** Du
f7c0: 70 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74  plicate an 8-byt
f7d0: 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69  e value.*/.stati
f7e0: 63 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65  c char *dup8byte
f7f0: 73 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  s(Vdbe *v, const
f800: 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68   char *in){.  ch
f810: 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65  ar *out = sqlite
f820: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c  3DbMallocRaw(sql
f830: 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38  ite3VdbeDb(v), 8
f840: 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
f850: 20 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20      memcpy(out, 
f860: 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65  in, 8);.  }.  re
f870: 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  turn out;.}../*.
f880: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
f890: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
f8a0: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
f8b0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
f8c0: 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
f8d0: 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
f8e0: 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
f8f0: 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
f900: 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
f910: 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
f920: 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
f930: 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
f940: 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
f950: 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
f960: 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
f970: 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
f980: 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
f990: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
f9a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f9b0: 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
f9c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
f9d0: 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 61 74  int n, int negat
f9e0: 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
f9f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 7a 20 7c 7c  {.  assert( z ||
fa00: 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   v==0 || sqlite3
fa10: 56 64 62 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f  VdbeDb(v)->mallo
fa20: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
fa30: 20 7a 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65   z ){.    double
fa40: 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61 72   value;.    char
fa50: 20 2a 7a 56 3b 0a 20 20 20 20 61 73 73 65 72 74   *zV;.    assert
fa60: 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29  ( !isdigit(z[n])
fa70: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   );.    sqlite3A
fa80: 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  toF(z, &value);.
fa90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
faa0: 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 7b 0a 20  sNaN(value) ){. 
fab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
fad0: 6c 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  l, 0, iMem);.   
fae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
faf0: 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76  ( negateFlag ) v
fb00: 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20  alue = -value;. 
fb10: 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
fb20: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
fb30: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
fb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
fb50: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
fb60: 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45  em, 0, zV, P4_RE
fb70: 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  AL);.    }.  }.}
fb80: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
fb90: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
fba0: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
fbb0: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
fbc0: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
fbd0: 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
fbe0: 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
fbf0: 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
fc00: 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
fc10: 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
fc20: 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
fc30: 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
fc40: 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
fc50: 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
fc60: 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
fc70: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
fc80: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
fc90: 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
fca0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
fcb0: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
fcc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
fcd0: 69 6e 74 20 6e 2c 20 69 6e 74 20 6e 65 67 46 6c  int n, int negFl
fce0: 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
fcf0: 20 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d   assert( z || v=
fd00: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62  =0 || sqlite3Vdb
fd10: 65 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61  eDb(v)->mallocFa
fd20: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20  iled );.  if( z 
fd30: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
fd40: 20 20 61 73 73 65 72 74 28 20 21 69 73 64 69 67    assert( !isdig
fd50: 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a 20 20 20 20  it(z[n]) );.    
fd60: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
fd70: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
fd80: 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
fd90: 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 20 20  ) i = -i;.      
fda0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fdb0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
fdc0: 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 7d   i, iMem);.    }
fdd0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
fde0: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 2c 20  FitsIn64Bits(z, 
fdf0: 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
fe00: 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20    i64 value;.   
fe10: 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20     char *zV;.   
fe20: 20 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34     sqlite3Atoi64
fe30: 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20  (z, &value);.   
fe40: 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29     if( negFlag )
fe50: 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
fe60: 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38  .      zV = dup8
fe70: 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29  bytes(v, (char*)
fe80: 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73  &value);.      s
fe90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
fea0: 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
feb0: 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34   iMem, 0, zV, P4
fec0: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c  _INT64);.    }el
fed0: 73 65 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65  se{.      codeRe
fee0: 61 6c 28 76 2c 20 7a 2c 20 6e 2c 20 6e 65 67 46  al(v, z, n, negF
fef0: 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
ff00: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
ff10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
ff20: 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
ff30: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
ff40: 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
ff50: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
ff60: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
ff70: 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
ff80: 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
ff90: 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
ffa0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
ffb0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
ffc0: 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
ffd0: 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
ffe0: 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
fff0: 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
10000 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
10010 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
10020 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
10030 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
10040 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
10050 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
10060 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
10070 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
10080 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
10090 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
100a0 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  owid..**.** This
100b0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
100c0 74 74 65 6d 70 74 20 74 6f 20 72 65 75 73 65 20  ttempt to reuse 
100d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
100e0 20 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20   column that.** 
100f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10100 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 61 20 72   loaded into a r
10110 65 67 69 73 74 65 72 2e 20 20 54 68 65 20 76 61  egister.  The va
10120 6c 75 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  lue will always.
10130 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ** be used if it
10140 20 68 61 73 20 6e 6f 74 20 75 6e 64 65 72 67 6f   has not undergo
10150 6e 65 20 61 6e 79 20 61 66 66 69 6e 69 74 79 20  ne any affinity 
10160 63 68 61 6e 67 65 73 2e 20 20 42 75 74 20 69 66  changes.  But if
10170 0a 2a 2a 20 61 6e 20 61 66 66 69 6e 69 74 79 20  .** an affinity 
10180 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72  change has occur
10190 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 61  red, then the ca
101a0 63 68 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  ched value will 
101b0 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73 65 64 20  only be.** used 
101c0 69 66 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67 20  if allowAffChng 
101d0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  is true..*/.int 
101e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
101f0 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
10200 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
10210 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
10220 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
10230 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
10240 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
10250 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
10260 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
10270 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
10280 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
10290 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
102a0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
102b0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
102c0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
102d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
102e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
102f0 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
10300 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
10310 72 65 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f  re */.  int allo
10320 77 41 66 66 43 68 6e 67 20 2f 2a 20 54 72 75 65  wAffChng /* True
10330 20 69 66 20 70 72 69 6f 72 20 61 66 66 69 6e 69   if prior affini
10340 74 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 4f  ty changes are O
10350 4b 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  K */.){.  Vdbe *
10360 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10370 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
10380 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
10390 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  p;..  for(i=0, p
103a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
103b0 68 65 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43  he; i<pParse->nC
103c0 6f 6c 43 61 63 68 65 3b 20 69 2b 2b 2c 20 70 2b  olCache; i++, p+
103d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
103e0 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
103f0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f   p->iColumn==iCo
10400 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 20  lumn.           
10410 26 26 20 28 21 70 2d 3e 61 66 66 43 68 61 6e 67  && (!p->affChang
10420 65 20 7c 7c 20 61 6c 6c 6f 77 41 66 66 43 68 6e  e || allowAffChn
10430 67 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20  g) ){.#if 0.    
10440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10450 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
10460 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10470 6e 74 28 28 76 2c 20 22 4f 50 54 3a 20 74 61 62  nt((v, "OPT: tab
10480 25 64 2e 63 6f 6c 25 64 20 2d 3e 20 72 25 64 22  %d.col%d -> r%d"
10490 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
104a0 6e 2c 20 70 2d 3e 69 52 65 67 29 29 3b 0a 23 65  n, p->iReg));.#e
104b0 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
104c0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
104d0 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
104e0 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69   v!=0 );.  if( i
104f0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
10500 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
10510 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
10520 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a  )) ? OP_VRowid :
10530 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73   OP_Rowid;.    s
10540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10550 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
10560 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  iReg);.  }else i
10570 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
10580 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10590 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
105a0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
105b0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 65 6c 73  n, iReg);.  }els
105c0 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
105d0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
105e0 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
105f0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71  P_Column;.    sq
10600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10610 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69  v, op, iTable, i
10620 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
10630 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
10640 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
10650 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
10660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10670 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
10680 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
10690 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
106a0 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
106b0 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
106c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
106d0 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
106e0 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
106f0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
10700 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
10710 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  ColCache==0 ){. 
10720 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69     i = pParse->i
10730 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 70 20  ColCache;.    p 
10740 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  = &pParse->aColC
10750 61 63 68 65 5b 69 5d 3b 0a 20 20 20 20 70 2d 3e  ache[i];.    p->
10760 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
10770 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20  .    p->iColumn 
10780 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  = iColumn;.    p
10790 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
107a0 20 20 20 70 2d 3e 61 66 66 43 68 61 6e 67 65 20     p->affChange 
107b0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
107c0 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
107d0 7a 65 28 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43  ze(pParse->aColC
107e0 61 63 68 65 29 20 29 20 69 20 3d 20 30 3b 0a 20  ache) ) i = 0;. 
107f0 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
10800 3e 6e 43 6f 6c 43 61 63 68 65 20 29 20 70 50 61  >nColCache ) pPa
10810 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20 3d  rse->nColCache =
10820 20 69 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   i;.    pParse->
10830 69 43 6f 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20  iColCache = i;. 
10840 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
10850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
10860 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
10870 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
10880 61 74 65 64 20 77 69 74 68 20 74 68 65 20 76 64  ated with the vd
10890 62 65 0a 2a 2a 20 63 75 72 73 6f 72 20 77 69 74  be.** cursor wit
108a0 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  h cursor number 
108b0 69 54 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  iTable..*/.void 
108c0 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
108d0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73  ColumnCache(Pars
108e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
108f0 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 54  Table){.  if( iT
10900 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 70 50  able<0 ){.    pP
10910 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 20  arse->nColCache 
10920 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
10930 3e 69 43 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a  >iColCache = 0;.
10940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
10950 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
10960 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
10970 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
10980 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43    if( pParse->aC
10990 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 54 61 62 6c  olCache[i].iTabl
109a0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
109b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
109c0 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ==pParse->nColCa
109d0 63 68 65 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  che-1 );.       
109e0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
109f0 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
10a00 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72  aColCache[--pPar
10a10 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
10a20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
10a30 69 43 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72  iColCache = pPar
10a40 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20  se->nColCache;. 
10a50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
10a70 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
10a80 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
10a90 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
10aa0 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
10ab0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
10ac0 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
10ad0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
10ae0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
10af0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
10b00 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
10b10 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 69 6e 74  t iCount){.  int
10b20 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
10b30 20 69 43 6f 75 6e 74 20 2d 20 31 3b 0a 20 20 69   iCount - 1;.  i
10b40 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
10b50 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43   i<pParse->nColC
10b60 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ache; i++){.    
10b70 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65 2d 3e  int r = pParse->
10b80 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
10b90 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 53  g;.    if( r>=iS
10ba0 74 61 72 74 20 26 26 20 72 3c 3d 69 45 6e 64 20  tart && r<=iEnd 
10bb0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
10bc0 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 61 66  >aColCache[i].af
10bd0 66 43 68 61 6e 67 65 20 3d 20 31 3b 0a 20 20 20  fChange = 1;.   
10be0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10bf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10c00 20 6d 6f 76 65 73 20 63 6f 6e 74 65 6e 74 20 66   moves content f
10c10 72 6f 6d 20 6f 6e 65 20 72 65 67 69 73 74 65 72  rom one register
10c20 20 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 2a 2a 20   to another..** 
10c30 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
10c40 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
10c50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10c60 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
10c70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
10c80 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
10c90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
10ca0 20 69 46 72 6f 6d 3d 3d 69 54 6f 20 29 20 72 65   iFrom==iTo ) re
10cb0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  turn;.  sqlite3V
10cc0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
10cd0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
10ce0 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 29 3b 0a 20  , iFrom, iTo);. 
10cf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
10d00 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
10d10 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
10d20 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
10d30 5d 2e 69 52 65 67 3d 3d 69 46 72 6f 6d 20 29 7b  ].iReg==iFrom ){
10d40 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
10d50 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67  ColCache[i].iReg
10d60 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
10d70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
10d80 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 72 65  n true if any re
10d90 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
10da0 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28  nge iFrom..iTo (
10db0 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73  inclusive).** is
10dc0 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
10dd0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
10de0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10df0 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63   usedAsColumnCac
10e00 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
10e10 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
10e20 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iTo){.  int i;.
10e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
10e40 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20  rse->nColCache; 
10e50 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  i++){.    int r 
10e60 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
10e70 63 68 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20  che[i].iReg;.   
10e80 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26   if( r>=iFrom &&
10e90 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72 6e   r<=iTo ) return
10ea0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
10eb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
10ec0 72 65 73 20 69 73 20 61 20 76 61 6c 75 65 20 69  res is a value i
10ed0 6e 20 72 65 67 69 73 74 65 72 20 69 43 75 72 72  n register iCurr
10ee0 65 6e 74 2e 20 20 57 65 20 75 6c 74 69 6d 61 74  ent.  We ultimat
10ef0 65 6c 79 20 77 61 6e 74 0a 2a 2a 20 74 68 65 20  ely want.** the 
10f00 76 61 6c 75 65 20 74 6f 20 62 65 20 69 6e 20 72  value to be in r
10f10 65 67 69 73 74 65 72 20 69 54 61 72 67 65 74 2e  egister iTarget.
10f20 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68    It might be th
10f30 61 74 0a 2a 2a 20 69 43 75 72 72 65 6e 74 20 61  at.** iCurrent a
10f40 6e 64 20 69 54 61 72 67 65 74 20 61 72 65 20 74  nd iTarget are t
10f50 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
10f60 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 72 65 20 67  ..**.** We are g
10f70 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74  oing to modify t
10f80 68 65 20 76 61 6c 75 65 2c 20 73 6f 20 77 65 20  he value, so we 
10f90 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
10fa0 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  e it.** is not a
10fb0 20 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72   cached register
10fc0 2e 20 20 49 66 20 69 43 75 72 72 65 6e 74 20 69  .  If iCurrent i
10fd0 73 20 61 20 63 61 63 68 65 64 20 72 65 67 69 73  s a cached regis
10fe0 74 65 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 72 79  ter,.** then try
10ff0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 76 61 6c   to move the val
11000 75 65 20 6f 76 65 72 20 74 6f 20 69 54 61 72 67  ue over to iTarg
11010 65 74 2e 20 20 49 66 20 69 54 61 72 67 65 74 20  et.  If iTarget 
11020 69 73 20 61 0a 2a 2a 20 63 61 63 68 65 64 20 72  is a.** cached r
11030 65 67 69 73 74 65 72 2c 20 74 68 65 6e 20 63 6c  egister, then cl
11040 65 61 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ear the correspo
11050 6e 64 69 6e 67 20 63 61 63 68 65 20 6c 69 6e 65  nding cache line
11060 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
11070 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
11080 20 74 68 65 20 76 61 6c 75 65 20 65 6e 64 73 20   the value ends 
11090 75 70 20 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  up in..*/.int sq
110a0 6c 69 74 65 33 45 78 70 72 57 72 69 74 61 62 6c  lite3ExprWritabl
110b0 65 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  eRegister(Parse 
110c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 43 75  *pParse, int iCu
110d0 72 72 65 6e 74 2c 20 69 6e 74 20 69 54 61 72 67  rrent, int iTarg
110e0 65 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  et){.  int i;.  
110f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
11100 70 56 64 62 65 21 3d 30 20 29 3b 0a 20 20 69 66  pVdbe!=0 );.  if
11110 28 20 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  ( !usedAsColumnC
11120 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 43 75  ache(pParse, iCu
11130 72 72 65 6e 74 2c 20 69 43 75 72 72 65 6e 74 29  rrent, iCurrent)
11140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 69   ){.    return i
11150 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 69  Current;.  }.  i
11160 66 28 20 69 43 75 72 72 65 6e 74 21 3d 69 54 61  f( iCurrent!=iTa
11170 72 67 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rget ){.    sqli
11180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
11190 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
111a0 53 43 6f 70 79 2c 20 69 43 75 72 72 65 6e 74 2c  SCopy, iCurrent,
111b0 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 0a 20   iTarget);.  }. 
111c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
111d0 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69  se->nColCache; i
111e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
111f0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
11200 5d 2e 69 52 65 67 3d 3d 69 54 61 72 67 65 74 20  ].iReg==iTarget 
11210 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
11220 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20  >aColCache[i] = 
11230 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
11240 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e[--pParse->nCol
11250 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 70 50  Cache];.      pP
11260 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65 20  arse->iColCache 
11270 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  = pParse->nColCa
11280 63 68 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  che;.    }.  }. 
11290 20 72 65 74 75 72 6e 20 69 54 61 72 67 65 74 3b   return iTarget;
112a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
112b0 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74 69 6f   last instructio
112c0 6e 20 63 6f 64 65 64 20 69 73 20 61 6e 20 65 70  n coded is an ep
112d0 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20  hemeral copy of 
112e0 61 6e 79 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  any of.** the re
112f0 67 69 73 74 65 72 73 20 69 6e 20 74 68 65 20 6e  gisters in the n
11300 52 65 67 20 72 65 67 69 73 74 65 72 73 20 62 65  Reg registers be
11310 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 69 52 65  ginning with iRe
11320 67 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 76 65  g, then.** conve
11330 72 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  rt the last inst
11340 72 75 63 74 69 6f 6e 20 66 72 6f 6d 20 4f 50 5f  ruction from OP_
11350 53 43 6f 70 79 20 74 6f 20 4f 50 5f 43 6f 70 79  SCopy to OP_Copy
11360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11370 33 45 78 70 72 48 61 72 64 43 6f 70 79 28 50 61  3ExprHardCopy(Pa
11380 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11390 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
113a0 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  {.  int addr;.  
113b0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  VdbeOp *pOp;.  V
113c0 64 62 65 20 2a 76 3b 0a 0a 20 20 76 20 3d 20 70  dbe *v;..  v = p
113d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
113e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
113f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11400 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65  ;.  pOp = sqlite
11410 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
11420 64 72 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28  dr-1);.  assert(
11430 20 70 4f 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e   pOp || pParse->
11440 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11450 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 20 26 26   );.  if( pOp &&
11460 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
11470 5f 53 43 6f 70 79 20 26 26 20 70 4f 70 2d 3e 70  _SCopy && pOp->p
11480 31 3e 3d 69 52 65 67 20 26 26 20 70 4f 70 2d 3e  1>=iReg && pOp->
11490 70 31 3c 69 52 65 67 2b 6e 52 65 67 20 29 7b 0a  p1<iReg+nReg ){.
114a0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
114b0 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20 7d 0a 7d  = OP_Copy;.  }.}
114c0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
114d0 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
114e0 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
114f0 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
11500 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
11510 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
11520 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
11530 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
11540 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
11550 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
11560 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
11570 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
11580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
11590 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
115a0 6e 74 65 65 64 20 74 68 61 74 20 72 65 73 75 6c  nteed that resul
115b0 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
115c0 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
115d0 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
115e0 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
115f0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
11600 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
11610 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
11620 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
11630 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
11640 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
11650 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
11660 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
11670 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
11680 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
11690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
116a0 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
116b0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
116c0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
116d0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
116e0 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
116f0 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
11700 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
11710 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
11720 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
11730 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
11740 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
11750 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
11760 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
11770 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
11780 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
11790 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
117a0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
117b0 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
117c0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
117d0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
117e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
117f0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
11800 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
11810 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
11820 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
11830 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
11840 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
11850 62 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  bers */..  asser
11860 74 28 20 76 21 3d 30 20 7c 7c 20 70 50 61 72 73  t( v!=0 || pPars
11870 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
11880 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
11890 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
118a0 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
118b0 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
118c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69  ) return 0;..  i
118d0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
118e0 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b     op = TK_NULL;
118f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
11900 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
11910 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  }.  switch( op )
11920 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
11930 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
11940 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
11950 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
11960 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
11970 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
11980 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
11990 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
119a0 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
119b0 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
119c0 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
119d0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69   assert( pCol->i
119e0 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Mem>0 );.       
119f0 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69   inReg = pCol->i
11a00 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Mem;.        bre
11a10 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
11a20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
11a30 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
11a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11a50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
11a60 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d  olumn, pAggInfo-
11a70 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20  >sortingIdx,.   
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11aa0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
11ab0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
11ac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11ad0 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
11ae0 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
11af0 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
11b00 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
11b10 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
11b20 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
11b30 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
11b40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
11b50 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11b60 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
11b70 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
11b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11b90 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
11ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
11bb0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
11bc0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
11bd0 61 73 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ase;.      }else
11be0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
11bf0 73 65 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  se( (pExpr->flag
11c00 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 21 3d  s & EP_AnyAff)!=
11c10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
11c20 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
11c30 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
11c40 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61  arse, pExpr->pTa
11c50 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
11c80 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
11c90 65 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  e, target,.     
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
11cc0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 41 6e  r->flags & EP_An
11cd0 79 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  yAff);.      }. 
11ce0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11cf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
11d00 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
11d10 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63  odeInteger(v, (c
11d20 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
11d30 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
11d40 6e 2e 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  n.n, 0, target);
11d50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11d70 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63  FLOAT: {.      c
11d80 6f 64 65 52 65 61 6c 28 76 2c 20 28 63 68 61 72  odeReal(v, (char
11d90 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
11da0 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
11db0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
11dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
11de0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
11df0 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
11e00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
11e10 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11e20 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 4f 50  3VdbeAddOp4(v,OP
11e30 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72  _String8, 0, tar
11e40 67 65 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  get, 0,.        
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
11e70 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
11e80 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
11e90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11ea0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
11eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11ec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
11ed0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
11ee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ef0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11f00 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
11f10 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
11f20 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
11f30 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
11f40 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
11f50 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
11f60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11f70 3e 74 6f 6b 65 6e 2e 6e 3e 3d 33 20 29 3b 0a 20  >token.n>=3 );. 
11f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
11f90 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
11fa0 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 74 6f  'x' || pExpr->to
11fb0 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 58 27 20 29 3b  ken.z[0]=='X' );
11fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11fd0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 31 5d  Expr->token.z[1]
11fe0 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
11ff0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74  assert( pExpr->t
12000 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d 3e 74 6f  oken.z[pExpr->to
12010 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29  ken.n-1]=='\'' )
12020 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70  ;.      n = pExp
12030 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a  r->token.n - 3;.
12040 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a        z = (char*
12050 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20  )pExpr->token.z 
12060 2b 20 32 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  + 2;.      zBlob
12070 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
12080 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
12090 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
120a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
120b0 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
120c0 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
120d0 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
120e0 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
120f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
12100 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
12110 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
12120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12130 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
12140 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61  Expr->iTable, ta
12150 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
12160 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
12170 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
12180 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
12190 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
121a0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
121b0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
121c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
121d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
121e0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
121f0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
12200 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
12210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12220 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12230 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
12240 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
12250 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
12260 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
12270 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
12280 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
12290 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70    int aff, to_op
122a0 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
122b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
122c0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
122d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
122e0 65 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d  et);.      aff =
122f0 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
12300 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Type(&pExpr->tok
12310 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70  en);.      to_op
12320 20 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f   = aff - SQLITE_
12330 41 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f  AFF_TEXT + OP_To
12340 54 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Text;.      asse
12350 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12360 54 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d  Text    || aff!=
12370 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
12380 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
12390 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
123a0 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d  Blob    || aff!=
123b0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
123c0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
123d0 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
123e0 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d  Numeric || aff!=
123f0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
12400 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  IC );.      asse
12410 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12420 49 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d  Int     || aff!=
12430 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
12440 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ER );.      asse
12450 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  rt( to_op==OP_To
12460 52 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d  Real    || aff!=
12470 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
12480 20 20 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74     );.      test
12490 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f  case( to_op==OP_
124a0 54 6f 54 65 78 74 20 29 3b 0a 20 20 20 20 20 20  ToText );.      
124b0 74 65 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d  testcase( to_op=
124c0 3d 4f 50 5f 54 6f 42 6c 6f 62 20 29 3b 0a 20 20  =OP_ToBlob );.  
124d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74 6f      testcase( to
124e0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
124f0 63 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c );.      testc
12500 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54  ase( to_op==OP_T
12510 6f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  oInt );.      te
12520 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
12530 50 5f 54 6f 52 65 61 6c 20 29 3b 0a 20 20 20 20  P_ToReal );.    
12540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12550 4f 70 31 28 76 2c 20 74 6f 5f 6f 70 2c 20 69 6e  Op1(v, to_op, in
12560 52 65 67 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Reg);.      test
12570 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
12580 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
12590 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
125a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
125b0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
125c0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
125d0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  Reg, 1);.      b
125e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
125f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12600 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
12610 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
12620 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
12630 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
12640 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
12650 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
12660 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
12670 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
12680 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
12690 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
126a0 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
126b0 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
126c0 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
126d0 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
126e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
126f0 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
12700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12710 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
12720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12730 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
12740 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12750 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
12760 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
12770 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
12780 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 45  tcase( op==TK_GE
12790 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
127a0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  se( op==TK_EQ );
127b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
127c0 20 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20   op==TK_NE );.  
127d0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f      codeCompareO
127e0 70 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20  perands(pParse, 
127f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
12800 31 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20  1, &regFree1,.  
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
12840 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  r2, &regFree2);.
12850 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12860 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12870 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
12880 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
128a0 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
128b0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
128c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
128d0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
128e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
128f0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
12900 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12910 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
12920 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
12930 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
12940 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
12950 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
12960 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
12970 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
12980 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
12990 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
129a0 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
129b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
129c0 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
129d0 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
129e0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
129f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12a00 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
12a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12a20 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
12a30 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
12a40 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
12a50 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
12a60 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
12a70 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
12a80 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
12a90 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
12aa0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
12ab0 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
12ac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12ad0 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
12ae0 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
12af0 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
12b00 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
12b10 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
12b20 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
12b30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12b40 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
12b50 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
12b60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
12b70 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
12b80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12b90 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
12ba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12bb0 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20  ( op==TK_OR );. 
12bc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12bd0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
12be0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12bf0 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
12c00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12c10 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20  ==TK_REM );.    
12c20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12c30 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
12c40 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12c50 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20  =TK_BITOR );.   
12c60 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12c70 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20  =TK_SLASH );.   
12c80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
12c90 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
12ca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
12cb0 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
12cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
12cd0 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
12ce0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
12cf0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
12d00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12d10 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
12d20 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
12d30 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
12d40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
12d50 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
12d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12d70 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
12d80 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
12d90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
12da0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
12db0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12dc0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
12dd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12de0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12df0 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
12e00 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
12e10 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
12e20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
12e30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
12e40 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
12e50 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
12e60 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
12e70 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
12e80 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
12e90 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
12ea0 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
12eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
12ec0 52 65 61 6c 28 76 2c 20 28 63 68 61 72 2a 29 70  Real(v, (char*)p
12ed0 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74 61  ->z, p->n, 1, ta
12ee0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  rget);.        }
12ef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12f00 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
12f10 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70 2d 3e 6e  char*)p->z, p->n
12f20 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
12f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 67  lse{.        reg
12f50 46 72 65 65 31 20 3d 20 72 31 20 3d 20 73 71 6c  Free1 = r1 = sql
12f60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12f70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
12f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
12fa0 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   0, r1);.       
12fb0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12fc0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12fd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12fe0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
12ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13000 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
13010 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
13020 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
13030 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13040 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
13050 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
13060 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
13070 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13080 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
13090 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
130a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
130b0 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
130c0 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
130d0 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
130e0 6f 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ot );.      test
130f0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
13100 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  NOT );.      tes
13110 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
13120 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
13130 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13140 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
13150 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
13160 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
13170 73 74 63 61 73 65 28 20 69 6e 52 65 67 3d 3d 74  stcase( inReg==t
13180 61 72 67 65 74 20 29 3b 0a 20 20 20 20 20 20 74  arget );.      t
13190 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
131a0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
131b0 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
131c0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
131d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 72 69  = sqlite3ExprWri
131e0 74 61 62 6c 65 52 65 67 69 73 74 65 72 28 70 50  tableRegister(pP
131f0 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 74 61 72  arse, inReg, tar
13200 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
13210 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13220 20 6f 70 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20   op, inReg);.   
13230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13240 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
13250 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
13260 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
13270 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13280 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
13290 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
132a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
132b0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
132c0 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 74  tNull );.      t
132d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
132e0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
132f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13300 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
13310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13320 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13330 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
13340 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
13350 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
13360 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
13370 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
13380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13390 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
133a0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
133b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
133c0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
133d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133e0 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
133f0 74 61 72 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20  target, -1);.   
13400 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13410 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
13420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13430 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
13440 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
13450 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
13460 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
13470 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
13480 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
13490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
134a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
134b0 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
134c0 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20  te: %T",.       
134d0 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61       &pExpr->spa
134e0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
134f0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
13500 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
13510 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
13520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13530 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13540 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
13550 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
13560 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
13570 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
13580 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
13590 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
135a0 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  r = pList ? pLis
135b0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
135c0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
135d0 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  f;.      int nId
135e0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
135f0 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69  ar *zId;.      i
13600 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
13610 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
13620 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
13630 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13640 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
13650 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c  C(db);.      Col
13660 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
13670 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
13680 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46  ( op==TK_CONST_F
13690 55 4e 43 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UNC );.      tes
136a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 46 55  tcase( op==TK_FU
136b0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  NCTION );.      
136c0 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
136d0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
136e0 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
136f0 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
13700 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
13710 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
13720 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
13730 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
13740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
13750 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ef!=0 );.      i
13760 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
13770 20 20 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73      nExpr = pLis
13780 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
13790 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
137a0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
137b0 65 2c 20 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  e, nExpr);.     
137c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
137d0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
137e0 65 2c 20 70 4c 69 73 74 2c 20 72 31 2c 20 31 29  e, pList, r1, 1)
137f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13800 20 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 72         nExpr = r
13810 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  1 = 0;.      }.#
13820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13830 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
13840 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
13850 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
13860 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
13870 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
13880 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
13890 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
138a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
138b0 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
138c0 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
138d0 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
138e0 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
138f0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
13900 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
13910 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
13920 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
13930 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
13940 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
13950 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
13960 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
13970 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
13980 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
13990 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
139a0 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
139b0 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
139c0 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
139d0 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
139e0 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
139f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
13a00 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
13a10 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
13a20 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
13a30 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
13a40 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
13a50 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
13a60 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
13a70 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
13a80 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
13a90 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
13aa0 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
13ab0 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
13ac0 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
13ad0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13ae0 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
13af0 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
13b00 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
13b10 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
13b20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
13b30 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  oadFunction(db, 
13b40 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
13b50 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
13b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13b70 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20   nExpr>0 ){.    
13b80 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
13b90 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
13ba0 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
13bb0 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
13bc0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
13bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13be0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
13bf0 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
13c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
13c10 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
13c20 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
13c30 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
13c40 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
13c50 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
13c60 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
13c70 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
13c80 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
13c90 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
13ca0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13cb0 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
13cc0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
13cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13ce0 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
13cf0 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
13d00 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
13d10 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
13d20 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
13d30 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
13d40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13d50 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
13d60 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
13d70 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
13d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13da0 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  4(v, OP_Function
13db0 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c  , constMask, r1,
13dc0 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34   (char*)pDef, P4
13df0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
13e00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13e10 67 65 50 35 28 76 2c 20 6e 45 78 70 72 29 3b 0a  geP5(v, nExpr);.
13e20 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72 20        if( nExpr 
13e30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13e40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
13e50 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
13e60 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
13e70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13e80 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
13e90 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
13ea0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  nExpr);.      br
13eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
13ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13ed0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
13ee0 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
13ef0 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
13f00 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
13f10 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ( op==TK_EXISTS 
13f20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13f30 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  e( op==TK_SELECT
13f40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
13f50 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20  xpr->iColumn==0 
13f60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13f70 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
13f80 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
13f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
13fa0 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
13fb0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 62 72 65 61  lumn;.      brea
13fc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13fd0 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
13fe0 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c   int j1, j2, j3,
13ff0 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 20 20 63   j4, j5;.      c
14000 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
14010 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a      int eType;..
14020 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 73 71        eType = sq
14030 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
14040 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
14050 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  0);..      /* Fi
14060 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
14070 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
14080 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
14090 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
140a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78      ** of the ex
140b0 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
140c0 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
140d0 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
140e0 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20  table for.      
140f0 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P4 of OP_Make
14100 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  Record..      */
14110 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
14120 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
14130 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
14140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14160 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
14170 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14180 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
14190 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
141a0 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ". The temporary
141b0 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
141c0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f  pExpr->iTable co
141d0 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
141e0 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
141f0 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20  he (...) set..  
14200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20      */.      r1 
14210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14220 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
14230 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
14240 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
14250 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
14260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6a 31 20  ==0 );.      j1 
14270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14280 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
14290 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  l, r1);.      sq
142a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
142b0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
142c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 6a 32  arget);.      j2
142d0 20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41    = sqlite3VdbeA
142e0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
142f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14300 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14310 6a 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  j1);.      if( e
14320 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
14330 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
14340 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
14350 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
14360 74 42 65 49 6e 74 2c 20 72 31 29 3b 0a 20 20 20  tBeInt, r1);.   
14370 20 20 20 20 20 6a 34 20 3d 20 73 71 6c 69 74 65       j4 = sqlite
14380 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14390 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78  P_NotExists, pEx
143a0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
143b0 31 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20 3d  1);.        j5 =
143c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
143d0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
143e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
143f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
14400 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
14410 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14420 76 2c 20 6a 34 29 3b 0a 20 20 20 20 20 20 7d 65  v, j4);.      }e
14430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 32 20  lse{.        r2 
14440 3d 20 72 65 67 46 72 65 65 32 20 3d 20 73 71 6c  = regFree2 = sql
14450 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
14460 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
14470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14480 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
14490 72 64 2c 20 72 31 2c 20 31 2c 20 72 32 2c 20 26  rd, r1, 1, r2, &
144a0 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
144b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
144c0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
144d0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
144e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 6a 35 20   1);.        j5 
144f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14500 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Op3(v, OP_Found,
14510 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14520 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  0, r2);.      }.
14530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14540 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
14550 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 2d 31  dImm, target, -1
14560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14570 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14580 6a 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  j2);.      sqlit
14590 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
145a0 2c 20 6a 35 29 3b 0a 20 20 20 20 20 20 62 72 65  , j5);.      bre
145b0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
145c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
145d0 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
145e0 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  D z.    **.    *
145f0 2a 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61  * This is equiva
14600 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20  lent to.    **. 
14610 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e     **    x>=y AN
14620 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20  D x<=z.    **.  
14630 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64    ** X is stored
14640 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   in pExpr->pLeft
14650 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74  ..    ** Y is st
14660 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
14670 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
14680 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74  ..    ** Z is st
14690 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
146a0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
146b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
146c0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
146d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
146e0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
146f0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
14700 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
14710 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Item = pExpr->pL
14720 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
14730 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
14740 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
14750 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70     codeCompareOp
14760 65 72 61 6e 64 73 28 70 50 61 72 73 65 2c 20 70  erands(pParse, p
14770 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46  Left, &r1, &regF
14780 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ree1,.          
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2c 20          pRight, 
147b0 26 72 32 2c 20 26 72 65 67 46 72 65 65 32 29 3b  &r2, &regFree2);
147c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
147d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
147e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
147f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
14800 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
14810 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14820 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
14830 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14840 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
14850 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
14860 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
14870 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
14890 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
148a0 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
148b0 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
148c0 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
148d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
148e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
148f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
14900 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
14910 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
14920 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
14930 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
14940 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14950 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
14960 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
14970 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
14980 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
14990 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
149a0 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
149b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c  ddOp3(v, OP_And,
149d0 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29   r3, r4, target)
149e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
149f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
14a00 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20  arse, r3);.     
14a10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14a20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14a30 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
14a40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14a50 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
14a60 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
14a70 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
14a80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
14a90 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
14aa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ab0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
14ac0 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20 2a 2a 20   Form A:.    ** 
14ad0 20 20 43 41 53 45 20 78 20 57 48 45 4e 20 65 31    CASE x WHEN e1
14ae0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32   THEN r1 WHEN e2
14af0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45   THEN r2 ... WHE
14b00 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  N eN THEN rN ELS
14b10 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
14b20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a 0a 20 20     ** Form B:.  
14b30 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e    **   CASE WHEN
14b40 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
14b50 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
14b60 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
14b70 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
14b80 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 20  *.    ** Form A 
14b90 69 73 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  is can be transf
14ba0 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68 65 20 65  ormed into the e
14bb0 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 6d 20 42  quivalent form B
14bc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
14bd0 20 2a 2a 20 20 20 43 41 53 45 20 57 48 45 4e 20   **   CASE WHEN 
14be0 78 3d 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=e1 THEN r1 WHE
14bf0 4e 20 78 3d 65 32 20 54 48 45 4e 20 72 32 20 2e  N x=e2 THEN r2 .
14c00 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ...    **       
14c10 20 57 48 45 4e 20 78 3d 65 4e 20 54 48 45 4e 20   WHEN x=eN THEN 
14c20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
14c30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 28 69    **.    ** X (i
14c40 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
14c50 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
14c60 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 69 6e 20  .    ** Y is in 
14c70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2e 20 20  pExpr->pRight.  
14c80 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
14c90 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 72  tional.  If ther
14ca0 65 20 69 73 20 6e 6f 0a 20 20 20 20 2a 2a 20 45  e is no.    ** E
14cb0 4c 53 45 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  LSE clause and n
14cc0 6f 20 6f 74 68 65 72 20 74 65 72 6d 20 6d 61 74  o other term mat
14cd0 63 68 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  ches, then the r
14ce0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
14cf0 20 2a 2a 20 65 78 70 72 73 73 69 6f 6e 20 69 73   ** exprssion is
14d00 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
14d10 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
14d20 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
14d30 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
14d40 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
14d50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14d60 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
14d70 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
14d80 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
14d90 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
14da0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
14db0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
14dc0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
14dd0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
14de0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
14df0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
14e00 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
14e10 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
14e20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20  int endLabel;   
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
14e50 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20  for end of CASE 
14e60 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  stmt */.      in
14e70 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20  t nextCase;     
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
14ea0 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75  r next WHEN clau
14eb0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
14ec0 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ee0 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48   2x number of WH
14ef0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
14f00 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
14f30 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ter */.      Exp
14f40 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f60 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74  * List of WHEN t
14f70 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74  erms */.      st
14f80 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
14f90 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20  em *aListelem;  
14fa0 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e  /* Array of WHEN
14fb0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
14fc0 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20  Expr opCompare; 
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65    /* The X==Ei e
14ff0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
15000 20 20 20 45 78 70 72 20 63 61 63 68 65 58 3b 20     Expr cacheX; 
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 2f 2a 20 43 61 63 68 65 64 20 65       /* Cached e
15030 78 70 72 65 73 73 69 6f 6e 20 58 20 2a 2f 0a 20  xpression X */. 
15040 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
15070 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
15080 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 3b      Expr *pTest;
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
150b0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
150c0 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 0a  Ei (form B) */..
150d0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
150e0 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
150f0 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
15100 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20  >pList->nExpr % 
15110 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20  2) == 0);.      
15120 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
15130 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
15140 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
15150 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
15160 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
15170 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
15180 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
15190 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
151a0 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
151b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
151c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
151d0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
151e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  =0 ){.        ca
151f0 63 68 65 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  cheX = *pX;.    
15200 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
15210 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
15220 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  || pX->op==TK_RE
15230 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20 20  GISTER );.      
15240 20 20 63 61 63 68 65 58 2e 69 54 61 62 6c 65 20    cacheX.iTable 
15250 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15260 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
15270 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
15280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15290 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
152a0 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 6f 70         cacheX.op
152b0 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
152c0 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e 69          cacheX.i
152d0 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20  Column = 0;.    
152e0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
152f0 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
15300 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
15310 74 20 3d 20 26 63 61 63 68 65 58 3b 0a 20 20 20  t = &cacheX;.   
15320 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
15330 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 7d  Compare;.      }
15340 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
15350 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
15360 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
15370 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
15380 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  {.        if( pX
15390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   ){.          op
153a0 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
153b0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
153c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
153d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
153e0 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
153f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
15400 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
15410 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
15420 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15430 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
15440 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
15450 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 65 73 74 2d  COLUMN || pTest-
15460 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
15470 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
15480 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
15490 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65  Parse, pTest, ne
154a0 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a  xtCase, SQLITE_J
154b0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
154c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
154d0 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
154e0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
154f0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  N );.        tes
15500 74 63 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d  tcase( aListelem
15510 5b 69 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d  [i+1].pExpr->op=
15520 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
15530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15540 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15550 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
15560 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
15570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15590 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61 62 65 6c  oto, 0, endLabel
155a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
155b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
155c0 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
155d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
155e0 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
155f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
15600 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15610 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
15620 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
15630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15650 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
15660 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15670 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
15680 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15690 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20  (v, endLabel);. 
156a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
156b0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
156c0 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  ache>0 );.      
156d0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
156e0 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20  olCache--;.     
156f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
15700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15710 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
15720 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
15730 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
15740 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
15750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15760 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
15790 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
157a0 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
157b0 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  -program");.    
157c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
157d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
157e0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
157f0 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
15800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
15810 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
15820 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
15840 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
15850 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
15870 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
15880 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
15890 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
158a0 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  eExpr(pParse->db
158b0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
158c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
158d0 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
158e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
158f0 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  NT, pExpr->iColu
15900 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  mn, 0,.         
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15920 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
15930 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
15940 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65  en.n);.      } e
15950 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
15960 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
15970 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
15980 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
15990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
159a0 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f  (v, OP_ContextPo
159b0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
159c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
159d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
159e0 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67   0, pParse->trig
159f0 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d  Stack->ignoreJum
15a00 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62  p);.         Vdb
15a10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 61  eComment((v, "ra
15a20 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
15a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
15a40 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
15a50 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
15a60 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15a70 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
15a80 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
15a90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15aa0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
15ab0 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
15ac0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
15ad0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
15ae0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
15af0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
15b00 74 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67  ts.** into a reg
15b10 69 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ister.  Return t
15b20 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
15b30 65 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73  er where the res
15b40 75 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ults.** are stor
15b50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
15b60 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74   register is a t
15b70 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
15b80 72 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65  r that can be de
15b90 61 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68  allocated,.** th
15ba0 65 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d  en write its num
15bb0 62 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20  ber into *pReg. 
15bc0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
15bd0 65 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a  egister is not.*
15be0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74  * a temporary, t
15bf0 68 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f  hen set *pReg to
15c00 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71   zero..*/.int sq
15c10 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15c20 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
15c30 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
15c40 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
15c50 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
15c60 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15c70 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
15c80 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
15c90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
15ca0 72 31 29 3b 0a 20 20 69 66 28 20 72 32 3d 3d 72  r1);.  if( r2==r
15cb0 31 20 29 7b 0a 20 20 20 20 2a 70 52 65 67 20 3d  1 ){.    *pReg =
15cc0 20 72 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   r1;.  }else{.  
15cd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15ce0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15cf0 72 31 29 3b 0a 20 20 20 20 2a 70 52 65 67 20 3d  r1);.    *pReg =
15d00 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
15d10 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   r2;.}../*.** Ge
15d20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
15d30 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65   will evaluate e
15d40 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
15d50 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a  and store the.**
15d60 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
15d70 73 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68  ster target.  Th
15d80 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75  e results are gu
15d90 61 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65  aranteed to appe
15da0 61 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ar.** in registe
15db0 72 20 74 61 72 67 65 74 2e 0a 2a 2f 0a 69 6e 74  r target..*/.int
15dc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15dd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15de0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
15df0 20 74 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20   target){.  int 
15e00 69 6e 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74  inReg;..  assert
15e10 28 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61  ( target>0 && ta
15e20 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d  rget<=pParse->nM
15e30 65 6d 20 29 3b 0a 20 20 69 6e 52 65 67 20 3d 20  em );.  inReg = 
15e40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15e50 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
15e60 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
15e70 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15e80 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65 2d  pVdbe || pParse-
15e90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15ea0 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 52 65 67  d );.  if( inReg
15eb0 21 3d 74 61 72 67 65 74 20 26 26 20 70 50 61 72  !=target && pPar
15ec0 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
15ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ee0 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
15ef0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
15f00 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  g, target);.  }.
15f10 20 20 72 65 74 75 72 6e 20 74 61 72 67 65 74 3b    return target;
15f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15f30 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
15f40 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  lutes the given 
15f50 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
15f60 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
15f70 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
15f80 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
15f90 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
15fa0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
15fb0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
15fc0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
15fd0 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
15fe0 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
15ff0 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
16000 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
16010 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
16020 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
16030 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
16040 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
16050 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16060 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
16070 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
16080 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
16090 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
160a0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
160b0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
160c0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
160d0 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
160e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
160f0 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
16100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
16110 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
16120 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
16130 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16140 3b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 20  ;.  int inReg;. 
16150 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
16160 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
16170 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
16180 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
16190 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  t>0 );.  if( pEx
161a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
161b0 54 45 52 20 29 7b 20 20 0a 20 20 20 20 69 6e 74  TER ){  .    int
161c0 20 69 4d 65 6d 3b 0a 20 20 20 20 69 4d 65 6d 20   iMem;.    iMem 
161d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
161e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
161f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
16200 70 79 2c 20 69 6e 52 65 67 2c 20 69 4d 65 6d 29  py, inReg, iMem)
16210 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
16220 62 6c 65 20 3d 20 69 4d 65 6d 3b 0a 20 20 20 20  ble = iMem;.    
16230 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
16240 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
16250 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
16260 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 20 20 72  EGISTER;.  }.  r
16270 65 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a  eturn inReg;.}..
16280 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
16290 45 20 69 66 20 70 45 78 70 72 20 69 73 20 61 6e  E if pExpr is an
162a0 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
162b0 73 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  sion that is app
162c0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 66 6f 72 20  ropriate.** for 
162d0 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 6f 66  factoring out of
162e0 20 61 20 6c 6f 6f 70 2e 20 20 41 70 70 72 6f 70   a loop.  Approp
162f0 72 69 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  riate expression
16300 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
16310 2a 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f  *  Any expressio
16320 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  n that evaluates
16330 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   to two or more 
16340 6f 70 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  opcodes..**.**  
16350 20 20 2a 20 20 41 6e 79 20 4f 50 5f 49 6e 74 65    *  Any OP_Inte
16360 67 65 72 2c 20 4f 50 5f 52 65 61 6c 2c 20 4f 50  ger, OP_Real, OP
16370 5f 53 74 72 69 6e 67 2c 20 4f 50 5f 42 6c 6f 62  _String, OP_Blob
16380 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 0a 2a 2a 20 20  , OP_Null, .**  
16390 20 20 20 20 20 6f 72 20 4f 50 5f 56 61 72 69 61       or OP_Varia
163a0 62 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ble that does no
163b0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 6c 61  t need to be pla
163c0 63 65 64 20 69 6e 20 61 20 0a 2a 2a 20 20 20 20  ced in a .**    
163d0 20 20 20 73 70 65 63 69 66 69 63 20 72 65 67 69     specific regi
163e0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ster..**.** Ther
163f0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
16400 20 66 61 63 74 6f 72 69 6e 67 20 6f 75 74 20 73   factoring out s
16410 69 6e 67 6c 65 2d 69 6e 73 74 72 75 63 74 69 6f  ingle-instructio
16420 6e 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  n constant.** ex
16430 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 6e  pressions that n
16440 65 65 64 20 74 6f 20 62 65 20 70 6c 61 63 65 64  eed to be placed
16450 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
16460 20 72 65 67 69 73 74 65 72 2e 20 20 0a 2a 2a 20   register.  .** 
16470 57 65 20 63 6f 75 6c 64 20 66 61 63 74 6f 72 20  We could factor 
16480 74 68 65 6d 20 6f 75 74 2c 20 62 75 74 20 74 68  them out, but th
16490 65 6e 20 77 65 20 77 6f 75 6c 64 20 65 6e 64 20  en we would end 
164a0 75 70 20 61 64 64 69 6e 67 20 61 6e 0a 2a 2a 20  up adding an.** 
164b0 4f 50 5f 53 43 6f 70 79 20 69 6e 73 74 72 75 63  OP_SCopy instruc
164c0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 74 68 65  tion to move the
164d0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
164e0 63 6f 72 72 65 63 74 20 72 65 67 69 73 74 65 72  correct register
164f0 0a 2a 2a 20 6c 61 74 65 72 2e 20 20 57 65 20 6d  .** later.  We m
16500 69 67 68 74 20 61 73 20 77 65 6c 6c 20 6a 75 73  ight as well jus
16510 74 20 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  t use the origin
16520 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  al instruction a
16530 6e 64 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20  nd.** avoid the 
16540 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 73 74 61  OP_SCopy..*/.sta
16550 74 69 63 20 69 6e 74 20 69 73 41 70 70 72 6f 70  tic int isApprop
16560 72 69 61 74 65 46 6f 72 46 61 63 74 6f 72 69 6e  riateForFactorin
16570 67 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  g(Expr *p){.  if
16580 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
16590 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
165a0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
165b0 20 30 3b 20 20 2f 2a 20 4f 6e 6c 79 20 63 6f 6e   0;  /* Only con
165c0 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
165d0 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  s are appropriat
165e0 65 20 66 6f 72 20 66 61 63 74 6f 72 69 6e 67 20  e for factoring 
165f0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
16600 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 69 78 65  >flags & EP_Fixe
16610 64 44 65 73 74 29 3d 3d 30 20 29 7b 0a 20 20 20  dDest)==0 ){.   
16620 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
16630 6e 79 20 63 6f 6e 73 74 61 6e 74 20 77 69 74 68  ny constant with
16640 6f 75 74 20 61 20 66 69 78 65 64 20 64 65 73 74  out a fixed dest
16650 69 6e 61 74 69 6f 6e 20 69 73 20 61 70 70 72 6f  ination is appro
16660 70 72 69 61 74 65 20 2a 2f 0a 20 20 7d 0a 20 20  priate */.  }.  
16670 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
16680 5f 55 50 4c 55 53 20 29 20 70 20 3d 20 70 2d 3e  _UPLUS ) p = p->
16690 70 4c 65 66 74 3b 0a 20 20 73 77 69 74 63 68 28  pLeft;.  switch(
166a0 20 70 2d 3e 6f 70 20 29 7b 0a 23 69 66 6e 64 65   p->op ){.#ifnde
166b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
166c0 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
166d0 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 23 65 6e  ase TK_BLOB:.#en
166e0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
166f0 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 63 61  VARIABLE:.    ca
16700 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
16710 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
16720 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  :.    case TK_NU
16730 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
16740 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
16750 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
16760 3d 54 4b 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  =TK_BLOB );.    
16770 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
16780 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
16790 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
167a0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
167b0 47 45 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  GER );.      tes
167c0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
167d0 5f 46 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20  _FLOAT );.      
167e0 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
167f0 3d 54 4b 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  =TK_NULL );.    
16800 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
16810 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 3b 0a  p==TK_STRING );.
16820 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 2d        /* Single-
16830 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6e 73  instruction cons
16840 74 61 6e 74 73 20 77 69 74 68 20 61 20 66 69 78  tants with a fix
16850 65 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  ed destination a
16860 72 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  re.      ** bett
16870 65 72 20 64 6f 6e 65 20 69 6e 2d 6c 69 6e 65 2e  er done in-line.
16880 20 20 49 66 20 77 65 20 66 61 63 74 6f 72 20 74    If we factor t
16890 68 65 6d 2c 20 74 68 65 79 20 77 69 6c 6c 20 6a  hem, they will j
168a0 75 73 74 20 65 6e 64 0a 20 20 20 20 20 20 2a 2a  ust end.      **
168b0 20 75 70 20 67 65 6e 65 72 61 74 69 6e 67 20 61   up generating a
168c0 6e 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 6d 6f  n OP_SCopy to mo
168d0 76 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ve the value to 
168e0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
168f0 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65        ** registe
16900 72 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  r. */.      retu
16910 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
16920 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
16930 7b 0a 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  {.       if( p->
16940 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
16950 4f 41 54 20 7c 7c 20 70 2d 3e 70 4c 65 66 74 2d  OAT || p->pLeft-
16960 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
16970 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
16980 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 7d 0a 20  rn 0;.       }. 
16990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
169a0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
169b0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
169c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
169d0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
169e0 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73   pExpr is a cons
169f0 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
16a00 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
16a10 61 74 65 20 66 6f 72 0a 2a 2a 20 66 61 63 74 6f  ate for.** facto
16a20 72 69 6e 67 20 6f 75 74 20 6f 66 20 61 20 6c 6f  ring out of a lo
16a30 6f 70 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74  op, then evaluat
16a40 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
16a50 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
16a60 74 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  ter and convert 
16a70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
16a80 6e 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45  nto a TK_REGISTE
16a90 52 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  R.** expression.
16aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
16ab0 76 61 6c 43 6f 6e 73 74 45 78 70 72 28 76 6f 69  valConstExpr(voi
16ac0 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
16ad0 45 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a  Expr){.  Parse *
16ae0 70 50 61 72 73 65 20 3d 20 28 50 61 72 73 65 2a  pParse = (Parse*
16af0 29 70 41 72 67 3b 0a 20 20 73 77 69 74 63 68 28  )pArg;.  switch(
16b00 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
16b10 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
16b20 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
16b30 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
16b40 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
16b50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
16b60 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
16b70 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
16b80 4e 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  NC: {.      /* T
16b90 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
16ba0 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 76 65 20  a function have 
16bb0 61 20 66 69 78 65 64 20 64 65 73 74 69 6e 61 74  a fixed destinat
16bc0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61  ion..      ** Ma
16bd0 72 6b 20 74 68 65 6d 20 74 68 69 73 20 77 61 79  rk them this way
16be0 20 74 6f 20 61 76 6f 69 64 20 67 65 6e 65 72 61   to avoid genera
16bf0 74 65 64 20 75 6e 6e 65 65 64 65 64 20 4f 50 5f  ted unneeded OP_
16c00 53 43 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 69  SCopy.      ** i
16c10 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 0a 20 20  nstructions. .  
16c20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
16c30 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16c40 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
16c50 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
16c60 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20          int i = 
16c70 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
16c80 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
16c90 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
16ca0 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  m = pList->a;.  
16cb0 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 30 3b        for(; i>0;
16cc0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
16cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
16ce0 74 65 6d 2d 3e 70 45 78 70 72 20 29 20 70 49 74  tem->pExpr ) pIt
16cf0 65 6d 2d 3e 70 45 78 70 72 2d 3e 66 6c 61 67 73  em->pExpr->flags
16d00 20 7c 3d 20 45 50 5f 46 69 78 65 64 44 65 73 74   |= EP_FixedDest
16d10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16d20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16d40 20 69 73 41 70 70 72 6f 70 72 69 61 74 65 46 6f   isAppropriateFo
16d50 72 46 61 63 74 6f 72 69 6e 67 28 70 45 78 70 72  rFactoring(pExpr
16d60 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  ) ){.    int r1 
16d70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16d80 3b 0a 20 20 20 20 69 6e 74 20 72 32 3b 0a 20 20  ;.    int r2;.  
16d90 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
16da0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
16db0 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
16dc0 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 32 20  .    if( r1!=r2 
16dd0 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
16de0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16df0 72 31 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  r1);.    pExpr->
16e00 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
16e10 3e 6f 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  >op;.    pExpr->
16e20 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
16e30 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  ;.    pExpr->iTa
16e40 62 6c 65 20 3d 20 72 32 3b 0a 20 20 20 20 72 65  ble = r2;.    re
16e50 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
16e60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16e70 20 50 72 65 65 76 61 6c 75 61 74 65 20 63 6f 6e   Preevaluate con
16e80 73 74 61 6e 74 20 73 75 62 65 78 70 72 65 73 73  stant subexpress
16e90 69 6f 6e 73 20 77 69 74 68 69 6e 20 70 45 78 70  ions within pExp
16ea0 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 0a  r and store the.
16eb0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  ** results in re
16ec0 67 69 73 74 65 72 73 2e 20 20 4d 6f 64 69 66 79  gisters.  Modify
16ed0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
16ee0 68 65 20 63 6f 6e 73 74 61 6e 74 20 73 75 62 65  he constant sube
16ef0 78 70 72 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  xpresions.** are
16f00 20 54 4b 5f 52 45 47 49 53 54 45 52 20 6f 70 63   TK_REGISTER opc
16f10 6f 64 65 73 20 74 68 61 74 20 72 65 66 65 72 20  odes that refer 
16f20 74 6f 20 74 68 65 20 70 72 65 63 6f 6d 70 75 74  to the precomput
16f30 65 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f  ed values..*/.vo
16f40 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
16f50 64 65 43 6f 6e 73 74 61 6e 74 73 28 50 61 72 73  deConstants(Pars
16f60 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
16f70 2a 70 45 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b  *pExpr){.   walk
16f80 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
16f90 65 76 61 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70  evalConstExpr, p
16fa0 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Parse);.}.../*.*
16fb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16fc0 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
16fd0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
16fe0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
16ff0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
17000 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65  n list into a se
17010 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
17020 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ers beginning at
17030 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52   target..**.** R
17040 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17050 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61   of elements eva
17060 6c 75 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  luated..*/.int s
17070 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
17080 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
17090 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
170a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
170b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
170c0 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65  List,   /* The e
170d0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
170e0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
170f0 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20 20  int target,     
17100 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
17110 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  rite results */.
17120 20 20 69 6e 74 20 64 6f 48 61 72 64 43 6f 70 79    int doHardCopy
17130 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 71 6c       /* Call sql
17140 69 74 65 33 45 78 70 72 48 61 72 64 43 6f 70 79  ite3ExprHardCopy
17150 20 6f 6e 20 65 61 63 68 20 65 6c 65 6d 65 6e 74   on each element
17160 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
17170 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17180 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17190 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65  int i, n;.  asse
171a0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20  rt( pList!=0 || 
171b0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
171c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
171d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
171e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
171f0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
17200 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  >0 );.  n = pLis
17210 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
17220 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17230 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
17240 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
17250 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
17260 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
17270 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  r, target+i);.  
17280 20 20 69 66 28 20 64 6f 48 61 72 64 43 6f 70 79    if( doHardCopy
17290 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 48 61   ) sqlite3ExprHa
172a0 72 64 43 6f 70 79 28 70 50 61 72 73 65 2c 20 74  rdCopy(pParse, t
172b0 61 72 67 65 74 2c 20 6e 29 3b 0a 20 20 7d 0a 20  arget, n);.  }. 
172c0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
172d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
172e0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
172f0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
17300 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
17310 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
17320 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
17330 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
17340 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
17350 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
17360 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
17370 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17380 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
17390 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
173a0 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
173b0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
173c0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
173d0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
173e0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
173f0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
17400 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
17410 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
17420 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
17430 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
17440 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
17450 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
17460 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
17470 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
17480 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
17490 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
174a0 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
174b0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
174c0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
174d0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
174e0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
174f0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
17500 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
17510 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
17520 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
17530 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
17540 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
17550 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
17560 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
17570 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
17580 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
17590 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
175a0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
175b0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
175c0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
175d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
175e0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
175f0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
17600 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
17610 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
17620 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
17630 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
17640 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
17650 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
17660 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
17670 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
17680 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
17690 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
176a0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
176b0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
176c0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
176d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
176e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
176f0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
17700 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17710 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
17720 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
17730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17740 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
17750 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
17760 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
17770 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
17780 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
17790 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
177a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
177b0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
177c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
177d0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
177e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
177f0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
17800 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20  lCache>0 );.    
17810 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
17820 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20  eColCache--;.   
17830 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17840 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
17850 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17860 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
17870 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
17880 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
17890 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ll==0 );.      t
178a0 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
178b0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
178c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
178d0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
178e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
178f0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
17900 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50  fNull);.      pP
17910 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
17920 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
17930 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
17940 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17950 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
17960 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
17970 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
17980 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
17990 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
179a0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
179b0 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65  che--;.      bre
179c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
179d0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
179e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
179f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
17a00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
17a10 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
17a20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
17a30 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17a50 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
17a60 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
17a70 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
17a80 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
17a90 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
17aa0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
17ab0 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
17ac0 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
17ad0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17ae0 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
17af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17b00 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
17b10 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17b20 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
17b30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
17b40 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
17b50 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
17b60 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
17b70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17b80 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
17b90 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
17ba0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17bb0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
17bc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17bd0 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
17be0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17bf0 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
17c00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17c10 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
17c20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
17c30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  l==0 );.      co
17c40 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
17c50 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
17c60 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65  >pLeft, &r1, &re
17c70 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20  gFree1,.        
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
17ca0 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72  >pRight, &r2, &r
17cb0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
17cc0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
17cd0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17ce0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17cf0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
17d00 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
17d10 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
17d20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17d30 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17d40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17d50 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
17d60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
17d80 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
17d90 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
17da0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
17db0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
17dc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17dd0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
17de0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
17df0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17e00 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
17e10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17e20 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
17e30 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17e40 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17e50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17e60 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
17e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e80 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
17e90 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
17ea0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17eb0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
17ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17ed0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
17ee0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78   {.      /*    x
17ef0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
17f00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17f10 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74  ** Is equivalent
17f20 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20   to .      **.  
17f30 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
17f40 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a  ND x<=z.      **
17f50 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69  .      ** Code i
17f60 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
17f70 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
17f80 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
17f90 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65  ssion.      ** e
17fa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
17fb0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17fc0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20   Expr exprAnd;. 
17fd0 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65       Expr compLe
17fe0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  ft;.      Expr c
17ff0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
18000 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20  Expr exprX;..   
18010 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70     exprX = *pExp
18020 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
18030 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
18040 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41  AND;.      exprA
18050 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
18060 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
18070 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
18080 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63  mpRight;.      c
18090 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
180a0 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  GE;.      compLe
180b0 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
180c0 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  X;.      compLef
180d0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
180e0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
180f0 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  xpr;.      compR
18100 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
18110 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
18120 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
18130 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
18140 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
18150 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
18160 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  pr;.      exprX.
18170 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
18180 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
18190 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
181a0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
181b0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
181c0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  1==0 );.      ex
181d0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
181e0 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74  STER;.      test
181f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
18200 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
18210 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
18220 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
18230 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
18240 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
18250 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
18260 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
18270 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18280 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
18290 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
182a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
182b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
182c0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
182d0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
182e0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
182f0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18300 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
18310 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
18320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18330 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
18340 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
18350 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
18360 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18370 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
18380 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
18390 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
183a0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
183b0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
183c0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
183d0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
183e0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
183f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
18400 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
18410 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
18420 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
18430 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
18440 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
18450 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
18460 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
18470 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
18480 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
18490 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
184a0 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
184b0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
184c0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
184d0 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
184e0 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
184f0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
18500 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
18510 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
18520 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
18530 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
18540 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
18550 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
18560 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
18570 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
18580 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
18590 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
185a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
185b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
185c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
185d0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
185e0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
185f0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
18600 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
18610 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
18620 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
18630 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
18640 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
18650 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
18660 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
18670 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
18680 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
18690 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
186a0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
186b0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
186c0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
186d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
186e0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
186f0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
18700 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
18710 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
18720 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
18730 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
18740 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
18750 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
18760 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
18770 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
18780 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
18790 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
187a0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
187b0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
187c0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
187d0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
187e0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
187f0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
18800 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
18810 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
18820 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
18830 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
18840 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
18850 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
18860 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
18870 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
18880 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
18890 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
188a0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
188b0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
188c0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
188d0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
188e0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
188f0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
18900 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
18910 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
18920 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18930 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
18940 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
18950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18960 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
18970 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
18980 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
18990 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
189a0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
189b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
189c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
189d0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
189e0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
189f0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
18a00 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
18a10 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
18a20 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
18a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
18a40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
18a50 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
18a60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18a70 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
18a80 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
18a90 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
18aa0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
18ab0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
18ac0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
18ad0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
18ae0 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69  case( pParse->di
18af0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
18b00 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
18b10 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
18b20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18b30 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
18b40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ull);.      pPar
18b50 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
18b60 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
18b70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
18b80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18b90 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
18ba0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
18bb0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
18bc0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
18bd0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
18be0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
18bf0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
18c00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18c10 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
18c20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
18c30 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
18c40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18c50 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
18c60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
18c70 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
18c80 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
18c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18ca0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
18cb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18cc0 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
18cd0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
18ce0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
18cf0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
18d00 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
18d10 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
18d20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
18d30 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
18d40 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
18d50 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
18d60 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
18d70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
18d80 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
18d90 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  -;.      sqlite3
18da0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18db0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
18dc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18dd0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
18de0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18df0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
18e00 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
18e10 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
18e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18e30 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
18e40 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
18e50 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
18e60 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
18e70 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
18e80 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
18e90 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
18ea0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
18eb0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18ec0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
18ed0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18ee0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
18ef0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
18f00 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
18f10 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18f20 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
18f30 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
18f40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18f50 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
18f60 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
18f70 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
18f80 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
18f90 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
18fa0 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fc0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
18fd0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
18fe0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
18ff0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
19000 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
19010 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
19020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19030 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
19040 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
19050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
19060 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
19070 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
19080 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
19090 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
190a0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
190b0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
190c0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
190d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
190e0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
190f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
19100 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
19110 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
19120 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
19130 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
19140 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19160 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
19170 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
19180 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
19190 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
191a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
191b0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
191c0 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
191d0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
191e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
191f0 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
19200 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
19210 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
19220 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
19230 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
19240 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
19250 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
19260 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
19270 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
19280 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
19290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
192a0 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
192b0 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
192c0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
192d0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
192e0 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
192f0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
19300 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  >pLeft;.      ex
19310 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
19320 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  D;.      exprAnd
19330 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
19340 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
19350 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
19360 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d  Right;.      com
19370 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
19380 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
19390 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
193a0 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
193b0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
193c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
193d0 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
193e0 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
193f0 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19400 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
19410 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
19420 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
19430 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
19440 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54  ;.      exprX.iT
19450 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
19460 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19470 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
19480 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
19490 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
194a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
194b0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
194c0 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER;.      testca
194d0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
194e0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
194f0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
19500 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
19510 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
19520 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19530 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
19540 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
19550 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19560 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
19570 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
19580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19590 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
195a0 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
195b0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
195c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
195d0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
195e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
195f0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
19600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19610 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
19620 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19630 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
19640 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19650 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19660 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
19670 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
19680 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
19690 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
196a0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
196b0 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
196c0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
196d0 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
196e0 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
196f0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
19700 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
19710 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
19720 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76   return FALSE ev
19730 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
19740 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
19750 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
19760 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
19770 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
19780 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
19790 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
197a0 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a  e return FALSE j
197b0 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
197c0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
197d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66  ine.** returns f
197e0 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64  alse, then you d
197f0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
19800 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
19810 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
19820 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
19830 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
19840 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74  u get a TRUE ret
19850 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
19860 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
19870 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
19880 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
19890 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
198a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
198b0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
198c0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
198d0 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20   an extra FALSE 
198e0 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
198f0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
19900 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
19910 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
19920 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
19930 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f  ncorrect TRUE co
19940 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
19950 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
19960 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
19970 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
19980 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20  xpr *pB){.  int 
19990 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  i;.  if( pA==0||
199a0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
199b0 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a  urn pB==pA;.  }.
199c0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
199d0 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
199e0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
199f0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
19a00 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
19a10 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
19a20 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
19a30 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
19a40 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
19a50 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
19a60 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
19a70 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
19a80 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
19a90 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
19aa0 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
19ab0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
19ac0 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
19ad0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
19ae0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
19af0 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
19b00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19b10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
19b20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19b30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
19b40 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
19b50 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  e(pA->pList->a[i
19b60 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69  ].pExpr, pB->pLi
19b70 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
19b80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19b90 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
19ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
19bb0 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  B->pList ){.    
19bc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19bd0 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20  if( pA->pSelect 
19be0 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29  || pB->pSelect )
19bf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19c00 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
19c10 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
19c20 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
19c30 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
19c40 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
19c50 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74  _COLUMN && pA->t
19c60 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
19c70 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
19c80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19c90 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
19ca0 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
19cb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
19cc0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
19cd0 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b  p((char*)pA->tok
19ce0 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e  en.z,(char*)pB->
19cf0 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65  token.z,pB->toke
19d00 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  n.n)!=0 ){.     
19d10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
19d20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
19d30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
19d40 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
19d50 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
19d60 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
19d70 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
19d80 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
19d90 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
19da0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
19db0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
19dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
19dd0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
19de0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
19df0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
19e00 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
19e10 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
19e20 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
19e30 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
19e40 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
19e50 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
19e60 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
19e70 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66   3,.       &pInf
19e80 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
19e90 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
19ea0 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  mnAlloc,.       
19eb0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
19ec0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
19ed0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
19ee0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
19ef0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
19f00 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
19f10 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
19f20 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
19f30 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
19f40 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
19f50 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
19f60 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
19f70 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
19f80 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
19f90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
19fa0 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
19fb0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
19fc0 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
19fd0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
19fe0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
19ff0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
1a000 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
1a010 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
1a020 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  c,.       &pInfo
1a030 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20  ->nFuncAlloc,.  
1a040 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
1a050 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
1a060 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  /*.** This is an
1a070 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
1a080 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74  xprTree() used t
1a090 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
1a0a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1a0b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
1a0c0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
1a0d0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
1a0e0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
1a0f0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1a100 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a110 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65  ine analyzes the
1a120 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1a130 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f  ion at pExpr..*/
1a140 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
1a150 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69  yzeAggregate(voi
1a160 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
1a170 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
1a180 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1a190 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
1a1a0 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  t *)pArg;.  Pars
1a1b0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
1a1c0 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
1a1d0 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
1a1e0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
1a1f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1a200 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
1a210 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
1a220 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1a230 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1a240 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
1a250 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
1a260 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1a270 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
1a280 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
1a290 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
1a2a0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
1a2b0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1a2c0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
1a2d0 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
1a2e0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1a2f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1a300 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
1a310 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
1a320 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
1a330 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1a340 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1a350 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1a360 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
1a370 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
1a380 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
1a390 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
1a3a0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
1a3b0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
1a3c0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
1a3d0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
1a3e0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
1a3f0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
1a400 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1a410 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
1a420 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
1a430 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1a440 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
1a450 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
1a460 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
1a470 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
1a480 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1a490 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
1a4a0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
1a4c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
1a4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
1a4e0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
1a4f0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
1a500 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
1a510 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
1a520 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
1a530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1a540 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
1a550 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a570 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
1a580 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1a5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a5c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a5d0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
1a5e0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
1a5f0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
1a600 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
1a610 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
1a620 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
1a630 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
1a640 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
1a650 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
1a660 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
1a670 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
1a680 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
1a690 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
1a6a0 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
1a6b0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
1a6c0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
1a6d0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
1a6e0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
1a6f0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
1a700 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a720 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1a730 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
1a740 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
1a750 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
1a760 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1a770 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1a780 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
1a790 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1a7b0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
1a7c0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
1a7d0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
1a7e0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1a7f0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
1a800 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
1a810 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
1a820 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1a830 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1a840 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
1a850 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
1a860 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1a870 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1a880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a890 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1a8a0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
1a8b0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
1a8c0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a8e0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
1a8f0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
1a920 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1a940 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1a990 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1a9a0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
1a9b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
1a9c0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
1a9d0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
1a9e0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
1a9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aa00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1aa10 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
1aa20 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
1aa30 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
1aa40 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
1aa50 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
1aa60 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
1aa70 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
1aa80 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
1aa90 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
1aaa0 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
1aab0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
1aac0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
1aad0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
1aae0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1aaf0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
1ab00 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
1ab10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1ab20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1ab30 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
1ab40 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
1ab50 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
1ab60 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
1ab70 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
1ab80 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  gg = k;.        
1ab90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1aba0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
1abb0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1abc0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
1abd0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
1abe0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
1abf0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
1ac00 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ac10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1ac20 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
1ac30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
1ac40 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65  NC->nDepth==0 te
1ac50 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67  st causes aggreg
1ac60 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
1ac70 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20   subqueries.    
1ac80 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72    ** to be ignor
1ac90 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
1aca0 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29  pNC->nDepth==0 )
1acb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
1acc0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
1acd0 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
1ace0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
1acf0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
1ad00 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
1ad10 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
1ad20 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
1ad30 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
1ad40 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
1ad50 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
1ad60 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
1ad70 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
1ad80 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1ad90 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1ada0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1adb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1adc0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
1add0 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ->pExpr, pExpr) 
1ade0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
1adf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1ae00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ae10 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
1ae20 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
1ae30 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
1ae40 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
1ae50 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
1ae60 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
1ae70 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
1ae80 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
1ae90 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
1aea0 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
1aeb0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
1aec0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
1aed0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1aee0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1af00 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
1af10 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
1af20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
1af30 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
1af40 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
1af50 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1af60 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
1af70 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
1af80 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
1af90 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
1afc0 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
1afd0 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20  >token.n,.      
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1aff0 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70  pr->pList ? pExp
1b000 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
1b010 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
1b020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
1b030 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
1b040 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1b050 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
1b060 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
1b070 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1b080 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1b0a0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
1b0b0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
1b0c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1b0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b0e0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
1b0f0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
1b100 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
1b110 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
1b120 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b130 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
1b140 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   i;.        pExp
1b150 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
1b160 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
1b170 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1b180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b190 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61  * Recursively wa
1b1a0 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f  lk subqueries lo
1b1b0 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c  oking for TK_COL
1b1c0 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e  UMN nodes that n
1b1d0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63  eed.  ** to be c
1b1e0 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47  hanged to TK_AGG
1b1f0 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e  _COLUMN.  But in
1b200 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73  crement nDepth s
1b210 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41  o that.  ** TK_A
1b220 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
1b230 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20  s in subqueries 
1b240 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65  will be unchange
1b250 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
1b260 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
1b270 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
1b280 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
1b290 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
1b2a0 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
1b2b0 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
1b2c0 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
1b2d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1b2e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
1b2f0 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
1b300 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
1b310 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
1b320 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
1b330 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
1b340 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
1b350 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
1b360 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
1b370 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
1b380 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
1b390 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
1b3a0 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
1b3b0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
1b3c0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
1b3d0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
1b3e0 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
1b3f0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
1b400 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
1b410 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
1b420 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
1b430 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1b440 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
1b450 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
1b460 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b   *pExpr){.  walk
1b470 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
1b480 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
1b490 2c 20 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pNC);.}../*.**
1b4a0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
1b4b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1b4c0 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
1b4d0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
1b4e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1b4f0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
1b500 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1b510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1b520 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
1b530 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
1b540 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
1b550 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1b560 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
1b570 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1b580 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1b590 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1b5a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1b5b0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b5c0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
1b5d0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1b5e0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1b5f0 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
1b600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b610 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1b620 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
1b630 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1b640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1b650 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
1b660 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65  te temporary use
1b670 20 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e   registers durin
1b680 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
1b690 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1b6a0 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
1b6b0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1b6c0 74 20 69 2c 20 72 3b 0a 20 20 69 66 28 20 70 50  t i, r;.  if( pP
1b6d0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1b6e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b6f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1b700 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b710 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
1b720 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 20 3d  g; i++){.    r =
1b730 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1b740 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 75 73  g[i];.    if( us
1b750 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1b760 70 50 61 72 73 65 2c 20 72 2c 20 72 29 20 29 20  pParse, r, r) ) 
1b770 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 20 20  continue;.  }.  
1b780 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
1b790 54 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 72  TempReg ){.    r
1b7a0 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1b7b0 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  nMem;.  }.  whil
1b7c0 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  e( i<pParse->nTe
1b7d0 6d 70 52 65 67 2d 31 20 29 7b 0a 20 20 20 20 70  mpReg-1 ){.    p
1b7e0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1b7f0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 54 65  i] = pParse->aTe
1b800 6d 70 52 65 67 5b 69 2b 31 5d 3b 0a 20 20 7d 0a  mpReg[i+1];.  }.
1b810 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
1b820 65 67 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 72  eg--;.  return r
1b830 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1b840 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
1b850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1b860 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
1b870 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
1b880 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1b890 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1b8a0 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  eg) ){.    pPars
1b8b0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
1b8c0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
1b8d0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
1b8e0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
1b8f0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
1b900 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
1b910 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
1b920 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
1b930 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
1b940 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b950 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
1b960 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
1b970 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
1b980 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
1b990 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
1b9a0 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c  =n && !usedAsCol
1b9b0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1b9c0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20   i, i+n-1) ){.  
1b9d0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1b9e0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
1b9f0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1ba00 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
1ba10 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
1ba20 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1ba30 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1ba40 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
1ba50 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
1ba60 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1ba70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1ba80 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
1ba90 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
1baa0 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
1bab0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
1bac0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1bad0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1bae0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
1baf0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a              iReg;.  }.}.