/ Hex Artifact Content
Login

Artifact b90fa835a2216edd6808b4bb5da6bbf3b8ee29b9:


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 32 34 37 20 32 30 30 36 2f 30 31 2f 31 30 20  .247 2006/01/10 
0220: 31 37 3a 35 38 3a 32 33 20 64 61 6e 69 65 6c 6b  17:58:23 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 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _AS ){.    retur
04e0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  n sqlite3ExprAff
04f0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0500: 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ft);.  }.  if( o
0510: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0520: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0530: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0540: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0550: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0560: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
0570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
0580: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41  .  if( op==TK_CA
0590: 53 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ST ){.    return
05a0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
05b0: 54 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b  Type(&pExpr->tok
05c0: 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  en);.  }.#endif.
05d0: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
05e0: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
05f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0600: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
0610: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
0620: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
0630: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
0640: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
0650: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
0660: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0670: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0680: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0690: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
06a0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
06b0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
06c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
06d0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
06e0: 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78 70 72  ;.    if( (pExpr
06f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 7c 7c 20 70  ->op==TK_AS || p
0700: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 41 53  Expr->op==TK_CAS
0710: 54 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  T) && !pColl ){.
0720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
0730: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
0740: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
0750: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
0760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
0770: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
0780: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0790: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
07a0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
07b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
07c0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
07d0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
07e0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
07f0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0800: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0810: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0820: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
0830: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0840: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0850: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
0860: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0870: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0880: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0890: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
08a0: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
08b0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
08c0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
08d0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
08e0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
08f0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0900: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0910: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0920: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
0930: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
0940: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
0950: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
0960: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
0970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0980: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
0990: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
09a0: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
09b0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
09c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
09d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
09e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
09f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0a00: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
0a10: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
0a20: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
0a30: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
0a40: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
0a50: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
0a60: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
0a70: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
0a80: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
0a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0aa0: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
0ab0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
0ac0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
0ad0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
0ae0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
0af0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
0b00: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
0b10: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
0b20: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
0b30: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
0b40: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
0b50: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
0b60: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
0b70: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0b80: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
0b90: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
0ba0: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
0bb0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
0bc0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
0bd0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
0be0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
0bf0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
0c00: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
0c10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
0c20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0c30: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
0c40: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
0c50: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
0c60: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
0c70: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
0c80: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
0c90: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0ca0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
0cb0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0cc0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
0cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0ce0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
0cf0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
0d00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
0d10: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0d20: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0d30: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
0d40: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
0d50: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
0d60: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
0d70: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
0d80: 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ty(pExpr->pSelec
0d90: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
0da0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
0db0: 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66  .  else if( !aff
0dc0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
0dd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0de0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
0df0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ff;.}../*.** pEx
0e00: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0e10: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  on expression, e
0e20: 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28  g. '=', '<', IN(
0e30: 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78  ...) etc..** idx
0e40: 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65  _affinity is the
0e50: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20   affinity of an 
0e60: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
0e70: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
0e80: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
0e90: 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66   affinity idx_af
0ea0: 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73  finity may be us
0eb0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
0ec0: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
0ed0: 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69  n in pExpr..*/.i
0ee0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  nt sqlite3IndexA
0ef0: 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a  ffinityOk(Expr *
0f00: 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f  pExpr, char idx_
0f10: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61  affinity){.  cha
0f20: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
0f30: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
0f40: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  );.  switch( aff
0f50: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
0f60: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20  ITE_AFF_NONE:.  
0f70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
0f80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
0f90: 46 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65  F_TEXT:.      re
0fa0: 74 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74  turn idx_affinit
0fb0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
0fc0: 58 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  XT;.    default:
0fd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
0fe0: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
0ff0: 66 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e  finity(idx_affin
1000: 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ity);.  }.}../*.
1010: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 31  ** Return the P1
1020: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
1030: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
1040: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
1050: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
1060: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
1070: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
1080: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
1090: 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66  r2..** If jumpIf
10a0: 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68  Null is true, th
10b0: 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62  en set the low b
10c0: 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  yte of the retur
10d0: 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20  ned.** P1 value 
10e0: 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f  to tell the opco
10f0: 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69  de to jump if ei
1100: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
1110: 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ** evaluates to 
1120: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
1130: 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  int binaryCompar
1140: 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP1(Expr *pExpr1
1150: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1160: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1170: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73 71  .  char aff = sq
1180: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1190: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74  y(pExpr2);.  ret
11a0: 75 72 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65  urn ((int)sqlite
11b0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
11c0: 28 70 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28  (pExpr1, aff))+(
11d0: 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30  jumpIfNull?0x100
11e0: 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  :0);.}../*.** Re
11f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1200: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  o the collation 
1210: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68  sequence that sh
1220: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a  ould be used by.
1230: 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  ** a binary comp
1240: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
1250: 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20  comparing pLeft 
1260: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a  and pRight..**.*
1270: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61  * If the left ha
1280: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  nd expression ha
1290: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
12a0: 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65  quence type, the
12b0: 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e  n it is.** used.
12c0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
12d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12e0: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
12f0: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  hand expression.
1300: 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74  ** is used, or t
1310: 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41  he default (BINA
1320: 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65  RY) if neither e
1330: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
1340: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70  collating.** typ
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
1360: 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70  lSeq* binaryComp
1370: 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  areCollSeq(Parse
1380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1390: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
13a0: 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ght){.  CollSeq 
13b0: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
13c0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13d0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
13e0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
13f0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1400: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1410: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  e, pRight);.  }.
1420: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1430: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1440: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
1450: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
1460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1470: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
1480: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1490: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14a0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
14b0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
14c0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
14d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
14e0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
14f0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1500: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1510: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
1520: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
1530: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1540: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
1550: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
1560: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
1570: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
1580: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
1590: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
15a0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
15b0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
15c0: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
15d0: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
15e0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
15f0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1600: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
1610: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1620: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
1630: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1640: 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  dbeOp3(pParse->p
1650: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31  Vdbe, opcode, p1
1660: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70  , dest, (void*)p
1670: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
1680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
1690: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
16a0: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
16b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
16c0: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
16d0: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73  for this node is
16e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
16f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
1700: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1710: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
1720: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1730: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
1740: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
1750: 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  freed..*/.Expr *
1760: 73 71 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20  sqlite3Expr(int 
1770: 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  op, Expr *pLeft,
1780: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63   Expr *pRight, c
1790: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
17a0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
17b0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
17c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
17d0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
17e0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
17f0: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1800: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
1810: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
1820: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
1830: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
1840: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
1850: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
1860: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
1870: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
1880: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
1890: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
18a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  e3ExprDelete(pLe
18b0: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
18c0: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
18d0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
18e0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
18f0: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
1900: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
1910: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
1920: 52 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69  Right;.  pNew->i
1930: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Agg = -1;.  if( 
1940: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
1950: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
1960: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
1970: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
1980: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
1990: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
19a0: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
19b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
19c0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
19d0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
19e0: 73 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  span);.  }.  ret
19f0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1a00: 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** When doing a 
1a10: 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f  nested parse, yo
1a20: 75 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65  u can include te
1a30: 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  rms in an expres
1a40: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f  sion.** that loo
1a50: 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23  k like this:   #
1a60: 30 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65  0 #1 #2 ...  The
1a70: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
1a80: 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  o elements.** on
1a90: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30   the stack.  "#0
1aa0: 22 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20  " means the top 
1ab0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
1ac0: 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20   "#1" means the 
1ad0: 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65  next down on the
1ae0: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20   stack.  And so 
1af0: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1b00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b10: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1b20: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1b30: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1b40: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1b50: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1b60: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1b70: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1b80: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1b90: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1ba0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1bb0: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1bc0: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1bd0: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1be0: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1bf0: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1c00: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1c10: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1c20: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1c30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c40: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1c50: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1c60: 74 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  th;.  if( pParse
1c70: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1c80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c90: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72  sg(pParse, "near
1ca0: 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20   \"%T\": syntax 
1cb0: 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b  error", pToken);
1cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1cd0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
1ce0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
1cf0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1d00: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1d10: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1d20: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d30: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1d40: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1d50: 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61  epth = atoi((cha
1d60: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
1d70: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1d80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1d90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1da0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1db0: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1dd0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1de0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1df0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e00: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1e10: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1e20: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1e30: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1e40: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1e50: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1e60: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1e70: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1e80: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1e90: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1ea0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1eb0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1ec0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1ed0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1ee0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1ef0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f00: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1f10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1f20: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1f30: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1f40: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1f50: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1f60: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1f70: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
1f80: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
1f90: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
1fa0: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
1fb0: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
1fc0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1fd0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
1fe0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
1ff0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2000: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
2010: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
2020: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e  e3ThreadData()->
2030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
2040: 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65  pRight->z && pLe
2050: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73  ft->z ){.    ass
2060: 65 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d  ert( pLeft->dyn=
2070: 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70  =0 || pLeft->z[p
2080: 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20  Left->n]==0 );. 
2090: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79     if( pLeft->dy
20a0: 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e  n==0 && pRight->
20b0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dyn==0 ){.      
20c0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
20d0: 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20  pLeft->z;.      
20e0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20  pExpr->span.n = 
20f0: 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69  pRight->n + (pRi
2100: 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e  ght->z - pLeft->
2110: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
2120: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
2130: 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  .z = 0;.    }.  
2140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
2150: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
2160: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
2170: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
2180: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
2190: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
21a0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
21b0: 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  on(ExprList *pLi
21c0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
21d0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
21e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
21f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
2200: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2210: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2230: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2250: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2260: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2280: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2290: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
22a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66  st = pList;.  if
22b0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
22c0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
22d0: 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e  dyn==0 );.    pN
22e0: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
22f0: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ken;.  }else{.  
2300: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
2310: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
2320: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
2330: 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ken;.  return pN
2340: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
2350: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
2360: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
2370: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
2380: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
2390: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
23a0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
23b0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
23c0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
23d0: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
23e0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
23f0: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
2400: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
2410: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
2420: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
2430: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
2440: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
2450: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
2460: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
2470: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
2480: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
2490: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
24a0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
24b0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
24c0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
24d0: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
24e0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24f0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
2500: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
2510: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
2520: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
2530: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
2540: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
2550: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
2560: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
2570: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
2580: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
2590: 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69  t sequenial vari
25a0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  able number is.*
25b0: 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76  * assigned..*/.v
25c0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
25d0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50  ssignVarNumber(P
25e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
25f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f  pr *pExpr){.  To
2600: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69  ken *pToken;.  i
2610: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
2620: 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d  turn;.  pToken =
2630: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a   &pExpr->token;.
2640: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2650: 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ->n>=1 );.  asse
2660: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
2670: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2680: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b  oken->z[0]!=0 );
2690: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e  .  if( pToken->n
26a0: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  ==1 ){.    /* Wi
26b0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
26c0: 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20  rm "?".  Assign 
26d0: 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c  the next variabl
26e0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
26f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2700: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
2710: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b    }else if( pTok
2720: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  en->z[0]=='?' ){
2730: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2740: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e   of the form "?n
2750: 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e  nn".  Convert "n
2760: 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nn" to an intege
2770: 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65  r and.    ** use
2780: 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61   it as the varia
2790: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
27a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78    int i;.    pEx
27b0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d  pr->iTable = i =
27c0: 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54   atoi((char*)&pT
27d0: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
27e0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
27f0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
2800: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
2810: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2820: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
2830: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
2840: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
2850: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
2860: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
2870: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
2880: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
2890: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
28a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
28b0: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
28c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
28d0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
28e0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
28f0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
2900: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
2910: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
2920: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
2930: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2940: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
2950: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
2960: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
2970: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
2980: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
2990: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
29a0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
29b0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
29c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
29d0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
29e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
29f0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
2a00: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
2a10: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
2a20: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
2a30: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
2a40: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
2a50: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
2a60: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
2a70: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a80: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
2a90: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
2aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ab0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
2ac0: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
2ad0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2ae0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2af0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
2b00: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
2b10: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2b20: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
2b30: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2b40: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
2b50: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b60: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
2b70: 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f   sqlite3ReallocO
2b80: 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70  rFree((void**)&p
2b90: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bb0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
2bc0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73  >nVarExprAlloc*s
2bd0: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70  izeof(pParse->ap
2be0: 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20  VarExpr[0]) );. 
2bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2c00: 20 21 73 71 6c 69 74 65 33 54 68 72 65 61 64 44   !sqlite3ThreadD
2c10: 61 74 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ata()->mallocFai
2c20: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
2c30: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
2c40: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
2c50: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
2c60: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
2c70: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
2c80: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
2c90: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
2ca0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
2cb0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
2cc0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
2cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2ce0: 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  te(Expr *p){.  i
2cf0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2d00: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  ;.  if( p->span.
2d10: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
2d20: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
2d30: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
2d40: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  en.dyn ) sqliteF
2d50: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ree((char*)p->to
2d60: 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ken.z);.  sqlite
2d70: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2d80: 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
2d90: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52  ExprDelete(p->pR
2da0: 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ight);.  sqlite3
2db0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2dc0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ->pList);.  sqli
2dd0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2de0: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->pSelect);.  s
2df0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2e00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  ./*.** The Expr.
2e10: 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67 68  token field migh
2e20: 74 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69  t be a string li
2e30: 74 65 72 61 6c 20 74 68 61 74 20 69 73 20 71 75  teral that is qu
2e40: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20  oted..** If so, 
2e50: 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74 61  remove the quota
2e60: 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76  tion marks..*/.v
2e70: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f  oid sqlite3Dequo
2e80: 74 65 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  teExpr(Expr *p){
2e90: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
2ea0: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
2eb0: 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  Dequoted) ){.   
2ec0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45   return;.  }.  E
2ed0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2ee0: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a  , EP_Dequoted);.
2ef0: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
2f00: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  yn==0 ){.    sql
2f10: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
2f20: 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b  ->token, &p->tok
2f30: 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  en);.  }.  sqlit
2f40: 65 33 44 65 71 75 6f 74 65 28 28 63 68 61 72 2a  e3Dequote((char*
2f50: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a  )p->token.z);.}.
2f60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2f70: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
2f80: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
2f90: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
2fa0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
2fb0: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
2fc0: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
2fd0: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
2fe0: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
2ff0: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
3000: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
3010: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
3020: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
3030: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
3040: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
3050: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
3060: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
3070: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
3080: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
3090: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
30a0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
30b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
30c0: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
30d0: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
30e0: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
30f0: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
3100: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
3110: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
3120: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
3130: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
3140: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
3150: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
3160: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
3170: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3180: 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78 70  lite3ExprDup(Exp
3190: 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  r *p){.  Expr *p
31a0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
31b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
31c0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
31d0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
31e0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
31f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3200: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
3210: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
3220: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
3230: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
3240: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29  >token.z = (u8*)
3250: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3260: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
3270: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20   p->token.n);.  
3280: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
3290: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
32a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
32b0: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
32c0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
32d0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
32e0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
32f0: 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29  xprDup(p->pLeft)
3300: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
3310: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3320: 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  p(p->pRight);.  
3330: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
3340: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3350: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
3360: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
3370: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3380: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e  ->pSelect);.  pN
3390: 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54  ew->pTab = p->pT
33a0: 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ab;.  return pNe
33b0: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
33c0: 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e  3TokenCopy(Token
33d0: 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46   *pTo, Token *pF
33e0: 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d  rom){.  if( pTo-
33f0: 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  >dyn ) sqliteFre
3400: 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29  e((char*)pTo->z)
3410: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
3420: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d   ){.    pTo->n =
3430: 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70   pFrom->n;.    p
3440: 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  To->z = (u8*)sql
3450: 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
3460: 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  *)pFrom->z, pFro
3470: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
3480: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3490: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
34a0: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
34b0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
34c0: 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70  tDup(ExprList *p
34d0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
34e0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
34f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
3500: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
3510: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3520: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3530: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3540: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
3550: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
3560: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3570: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
3580: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3590: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
35a0: 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71  ->a = pItem = sq
35b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
35c0: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
35d0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
35e0: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
35f0: 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  liteFree(pNew);.
3600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3610: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
3620: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
3630: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
3640: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
3650: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
3660: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
3670: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
3680: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
3690: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
36a0: 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70  Dup(pOldExpr = p
36b0: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  OldItem->pExpr);
36c0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
36d0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
36e0: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
36f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
3700: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
3710: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
3720: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
3730: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
3740: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
3750: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
3760: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
3770: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
3780: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
3790: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
37a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
37b0: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
37c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
37d0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
37e0: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
37f0: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
3800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
3810: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
3820: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
3830: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
3840: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
3850: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
3860: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
3870: 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  ()->mallocFailed
3880: 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   );.    pItem->z
3890: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
38a0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
38b0: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
38c0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
38d0: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
38e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
38f0: 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  gg = pOldItem->i
3900: 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d  sAgg;.    pItem-
3910: 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >done = 0;.  }. 
3920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3930: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
3940: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
3950: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
3960: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
3970: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
3980: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
3990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
39a0: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
39b0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
39c0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
39d0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
39e0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
39f0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
3a00: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
3a10: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
3a20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3a30: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
3a40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3a50: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
3a60: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
3a70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
3a80: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
3a90: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 53  ite3SrcListDup(S
3aa0: 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72  rcList *p){.  Sr
3ab0: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
3ac0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
3ad0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
3ae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
3af0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
3b00: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
3b10: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
3b20: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
3b30: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3b40: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
3b50: 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e );.  if( pNew=
3b60: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3b70: 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e   pNew->nSrc = pN
3b80: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3b90: 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nSrc;.  for(i=0;
3ba0: 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29   i<p->nSrc; i++)
3bb0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
3bc0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
3bd0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
3be0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ];.    struct Sr
3bf0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  cList_item *pOld
3c00: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
3c10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
3c20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c30: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
3c40: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3c50: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
3c60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
3c70: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3c80: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
3c90: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
3ca0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
3cb0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3cc0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
3cd0: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
3ce0: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
3cf0: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
3d00: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
3d10: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
3d20: 72 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e  r;.    pTab = pN
3d30: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
3d40: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
3d50: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
3d60: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
3d70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
3d80: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
3d90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
3da0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  p(pOldItem->pSel
3db0: 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ect);.    pNewIt
3dc0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
3dd0: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65  3ExprDup(pOldIte
3de0: 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65  m->pOn);.    pNe
3df0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
3e00: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
3e10: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e  (pOldItem->pUsin
3e20: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
3e30: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
3e40: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
3e50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3e60: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
3e70: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
3e80: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
3e90: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
3ea0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3eb0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3ec0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3ed0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
3ee0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3ef0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f00: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
3f10: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
3f20: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
3f30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3f40: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
3f50: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3f60: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
3f70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65    sqliteFree(pNe
3f80: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3f90: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
3fa0: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
3fb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
3fc0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
3fd0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
3fe0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
3ff0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4000: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4010: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
4020: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
4030: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
4040: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4050: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
4060: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
4070: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
4080: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4090: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
40a0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
40b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
40c0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
40d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
40e0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
40f0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
4100: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
4110: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
4120: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
4130: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
4140: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4150: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
4160: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
4170: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
4180: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
4190: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
41a0: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
41b0: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
41c0: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
41d0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
41e0: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
41f0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
4200: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
4210: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
4220: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
4230: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
4240: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
4250: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
4260: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
4270: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4280: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4290: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
42a0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
42b0: 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Limit);.  pNew->
42c0: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
42d0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66  3ExprDup(p->pOff
42e0: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
42f0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
4300: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
4310: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
4320: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
4330: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
4340: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4350: 20 70 4e 65 77 2d 3e 75 73 65 73 56 69 72 74 20   pNew->usesVirt 
4360: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
4370: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
4380: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
4390: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
43a0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30  ->addrOpenVirt[0
43b0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
43c0: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
43d0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
43e0: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
43f0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
4400: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
4410: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4420: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
4430: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
4440: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4450: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
4460: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
4470: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
4480: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
4490: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
44a0: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
44b0: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
44c0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
44d0: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
44e0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
44f0: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
4500: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
4510: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
4520: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
4530: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
4540: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
4550: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
4560: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
4570: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
4580: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4590: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
45a0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
45b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
45c0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
45d0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
45e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
45f0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74  item *a;.    int
4600: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   n = pList->nAll
4610: 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20  oc*2 + 4;.    a 
4620: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4630: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
4640: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
4650: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
4660: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4670: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
4680: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
4690: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
46a0: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
46b0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
46c0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
46d0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
46e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
46f0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
4700: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
4710: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
4720: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
4730: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
4740: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
4750: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4760: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
4770: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4780: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
4790: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
47a0: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
47b0: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
47c0: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
47d0: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
47e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
47f0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
4800: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4810: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
4820: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4830: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
4840: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4850: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4860: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
4870: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
4880: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
4890: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
48a0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
48b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
48c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
48d0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
48e0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
48f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
4900: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
4910: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
4920: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
4930: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
4940: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4950: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
4960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
4970: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
4980: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
4990: 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
49a0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
49b0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
49c0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
49d0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
49e0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
49f0: 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20  ion tree.  Call 
4a00: 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e  xFunc for each n
4a10: 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a  ode visited..**.
4a20: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4a30: 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64  lue from xFunc d
4a40: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
4a50: 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20  r the tree walk 
4a60: 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20  continues..** 0 
4a70: 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77  means continue w
4a80: 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e  alking the tree.
4a90: 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74    1 means do not
4aa0: 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a   walk children.*
4ab0: 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
4ac0: 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e   node but contin
4ad0: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73  ue with siblings
4ae0: 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64  .  2 means aband
4af0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77  on.** the tree w
4b00: 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  alk completely..
4b10: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
4b20: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73   value from this
4b30: 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f   routine is 1 to
4b40: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
4b50: 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20  e walk.** and 0 
4b60: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
4b70: 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73  ** NOTICE:  This
4b80: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e   routine does *n
4b90: 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  ot* descend into
4ba0: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
4bb0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
4bc0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
4bd0: 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64   *, int (*)(void
4be0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4bf0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
4c00: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
4c10: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
4c20: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
4c30: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4c40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
4c50: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
4c60: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a  urn 0;.  rc = (*
4c70: 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78  xFunc)(pArg, pEx
4c80: 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  pr);.  if( rc==0
4c90: 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   ){.    if( walk
4ca0: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
4cb0: 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41  pLeft, xFunc, pA
4cc0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4cd0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4ce0: 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Tree(pExpr->pRig
4cf0: 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ht, xFunc, pArg)
4d00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4d10: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73   if( walkExprLis
4d20: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
4d30: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4d40: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4d50: 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f  eturn rc>1;.}../
4d60: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
4d70: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
4d80: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
4d90: 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74   list p..*/.stat
4da0: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c  ic int walkExprL
4db0: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
4dc0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4dd0: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
4de0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
4df0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
4e00: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
4e10: 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  m;.  if( !p ) re
4e20: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
4e30: 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  p->nExpr, pItem=
4e40: 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  p->a; i>0; i--, 
4e50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
4e60: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
4e70: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75  Item->pExpr, xFu
4e80: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4e90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4ea0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
4eb0: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
4ec0: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
4ed0: 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63  ression in Selec
4ee0: 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  t p, not includi
4ef0: 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
4f00: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
4f10: 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  of sub-selects i
4f20: 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73  n any FROM claus
4f30: 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a  e or the LIMIT.*
4f40: 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72  * or OFFSET expr
4f50: 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61  essions...*/.sta
4f60: 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65  tic int walkSele
4f70: 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70  ctExpr(Select *p
4f80: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
4f90: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
4fa0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61  oid *pArg){.  wa
4fb0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  lkExprList(p->pE
4fc0: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
4fd0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
4fe0: 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46  ee(p->pWhere, xF
4ff0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
5000: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  lkExprList(p->pG
5010: 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70  roupBy, xFunc, p
5020: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
5030: 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Tree(p->pHaving,
5040: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5050: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
5060: 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63  >pOrderBy, xFunc
5070: 2c 20 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72  , pArg);.  retur
5080: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
5090: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
50a0: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
50b0: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
50c0: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41  Tree()..**.** pA
50d0: 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  rg is really a p
50e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
50f0: 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e  eger.  If we can
5100: 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67   tell by looking
5110: 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68 61  .** at pExpr tha
5120: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
5130: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
5140: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f  Expr is not a co
5150: 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
5160: 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a  sion, then set *
5170: 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65  pArg to 0 and re
5180: 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f  turn 2 to abando
5190: 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  n the tree walk.
51a0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65  .** If pExpr doe
51b0: 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75  s does not disqu
51c0: 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65 73  alify the expres
51d0: 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20  sion from being 
51e0: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  a constant.** th
51f0: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
5200: 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69  *.** After walki
5210: 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65  ng the whole tre
5220: 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61  e, if no nodes a
5230: 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69  re found that di
5240: 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20  squalify.** the 
5250: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f  expression as co
5260: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20  nstant, then we 
5270: 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65  assume the whole
5280: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
5290: 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  s constant.  See
52a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
52b0: 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64  nstant() for add
52c0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
52d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
52e0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
52f0: 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67  stant(void *pArg
5300: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5310: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
5320: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
5330: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
5340: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
5350: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
5360: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
5370: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a  ant.    ** and *
5380: 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  pArg==2 */.    c
5390: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
53a0: 0a 20 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e  .      if( *((in
53b0: 74 2a 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65  t*)pArg)==2 ) re
53c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
53d0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
53e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
53f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
5400: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
5410: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
5420: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
5430: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
5440: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
5450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5460: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
5470: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
5480: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
5490: 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74  dif.      *((int
54a0: 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20  *)pArg) = 0;.   
54b0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
54c0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
54d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
54e0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
54f0: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d   *((int*)pArg) =
5500: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
5510: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
5520: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
5550: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5560: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
5570: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5580: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
5590: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
55a0: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
55b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
55c0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
55d0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
55e0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
55f0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5600: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
5610: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
5620: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
5630: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5640: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
5650: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
5660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5670: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
5680: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
5690: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
56a0: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
56b0: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
56c0: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
56d0: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
56e0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
56f0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
5700: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
5710: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
5720: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
5730: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
5740: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
5750: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
5760: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
5770: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
5780: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
5790: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
57a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
57b0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
57c0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
57d0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
57e0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
57f0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
5800: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
5810: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
5820: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5830: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
5840: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
5850: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5860: 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 2;.  walkExp
5870: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5880: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5890: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
58a0: 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a   isConst!=0;.}..
58b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
58c0: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
58d0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
58e0: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
58f0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
5900: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
5910: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
5920: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
5930: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
5940: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
5950: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
5960: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
5970: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
5980: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
5990: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
59a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
59b0: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
59c0: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
59d0: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
59e0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
59f0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
5a00: 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68  Value){.  switch
5a10: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
5a20: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
5a30: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5a40: 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61  te3GetInt32((cha
5a50: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
5a60: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
5a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5a80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5a90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5aa0: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
5ab0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5ac0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
5ad0: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
5ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5af0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
5b00: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
5b10: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
5b20: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
5b30: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
5b40: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
5b50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5b60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5b80: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
5b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5bb0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
5bc0: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
5bd0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
5be0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5bf0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
5c00: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
5c10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c20: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
5c30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
5c40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5c50: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
5c60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
5c70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5c80: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
5c90: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
5ca0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
5cb0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
5cc0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
5cd0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
5ce0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
5cf0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
5d00: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
5d10: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
5d20: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
5d30: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
5d40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
5d50: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
5d60: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
5d70: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
5d80: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
5d90: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
5da0: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
5db0: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
5dc0: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
5dd0: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
5de0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
5df0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
5e10: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
5e20: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
5e30: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
5e40: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
5e50: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
5e60: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
5e80: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
5e90: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5ea0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
5eb0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
5ec0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
5ed0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
5ee0: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
5ef0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
5f00: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
5f10: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
5f20: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
5f30: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
5f40: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
5f50: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
5f60: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
5f70: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
5f80: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
5f90: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
5fa0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
5fb0: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
5fc0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
5fd0: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
5fe0: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
5ff0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
6000: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
6010: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
6020: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
6030: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
6040: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
6050: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
6060: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
6070: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
6080: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
6090: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
60a0: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
60b0: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
60c0: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
60d0: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
60e0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
60f0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
6100: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
6110: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
6120: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
6130: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
6140: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
6150: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
6160: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
6170: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
6180: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
6190: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
61a0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
61b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
61c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
61d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
61e0: 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c  Token *pDbToken,
61f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6200: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
6210: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
6220: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
6230: 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20  n *pTableToken, 
6240: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
6250: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
6260: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
6270: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
6280: 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Token, /* Name o
6290: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
62a0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
62b0: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
62c0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
62d0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
62e0: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
62f0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
6300: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
6310: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
6320: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
6330: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  mn */.){.  char 
6340: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *zDb = 0;       
6350: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
6360: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58  atabase.  The "X
6370: 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20  " in X.Y.Z */.  
6380: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
6390: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
63a0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
63b0: 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20  "Y" in X.Y.Z or 
63c0: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
63d0: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Col = 0;      /*
63e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
63f0: 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f  umn.  The "Z" */
6400: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
6410: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
6420: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
6430: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
6440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6450: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
6460: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
6470: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
6480: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
6490: 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  ching table name
64a0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
64b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
64c0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
64d0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
64e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
64f0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
6500: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
6510: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
6520: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
6530: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
6540: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
6550: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
6560: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
6570: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
6580: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
6590: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
65a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
65b0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
65c0: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
65d0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
65e0: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
65f0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
6600: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
6610: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
6620: 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62  DbToken);.  zTab
6630: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6640: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f  omToken(pTableTo
6650: 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73  ken);.  zCol = s
6660: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6670: 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  ken(pColumnToken
6680: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6690: 54 68 72 65 61 64 44 61 74 61 28 29 2d 3e 6d 61  ThreadData()->ma
66a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
66b0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
66c0: 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45  e_end;.  }..  pE
66d0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
66e0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26  ;.  while( pNC &
66f0: 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  & cnt==0 ){.    
6700: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6710: 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
6720: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
6730: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66  SrcList;..    if
6740: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
6750: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
6760: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
6770: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
6780: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
6790: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
67a0: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
67b0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
67c0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
67d0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
67e0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
67f0: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
6800: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
6810: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f  if( pTab==0 ) co
6820: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6830: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6840: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
6850: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
6860: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
6870: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
6880: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6890: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
68a0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
68b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
68c0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
68d0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
68e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6900: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
6910: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6930: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
6940: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6950: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
6960: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6970: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
6980: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
6990: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  rICmp(db->aDb[iD
69a0: 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b].zName, zDb)!=
69b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
69c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
69d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
69e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
69f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
6a00: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
6a10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6a20: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
6a30: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
6a40: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
6a50: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
6a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
6a70: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
6a80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
6a90: 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(j=0, pCol=pTab
6aa0: 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
6ab0: 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b  nCol; j++, pCol+
6ac0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
6ad0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6ae0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
6af0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
6b00: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
6b10: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e   *zColl = pTab->
6b20: 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
6b30: 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73             IdLis
6b40: 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t *pUsing;.     
6b50: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
6b60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6b70: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
6b80: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
6b90: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6ba0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6bb0: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
6bc0: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
6bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
6be0: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
6bf0: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
6c00: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
6c10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
6c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6c30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
6c40: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
6c50: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
6c60: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
6c70: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
6c80: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
6c90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6ca0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
6cb0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
6cc0: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31  NC(db), zColl,-1
6cd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6ce0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
6cf0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
6d00: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
6d10: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
6d20: 61 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e  atch occurred in
6d30: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
6d40: 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69  of a natural joi
6d50: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
6d60: 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68   ** then skip th
6d70: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f  e right table to
6d80: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
6d90: 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  te match */.    
6da0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
6db0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
6dc0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
6dd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6de0: 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49  if( (pUsing = pI
6df0: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20  tem->pUsing)!=0 
6e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6e10: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
6e20: 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f  h occurs on a co
6e30: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20  lumn that is in 
6e40: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
6e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
6e60: 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69  * of a join, ski
6e70: 70 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20  p the search of 
6e80: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
6e90: 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20  of the join.    
6ea0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
6eb0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6ec0: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
6ed0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
6ee0: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
6ef0: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
6f00: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6f20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6f30: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
6f40: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
6f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6f60: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
6f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f80: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6f90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
6fc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
6fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6fe0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
6ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7000: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
7010: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
7020: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
7030: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
7040: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
7050: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
7060: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
7070: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
7080: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
7090: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
70a0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
70b0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
70c0: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
70d0: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
70e0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
70f0: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
7100: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
7110: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
7120: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
7130: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
7140: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
7150: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
7160: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
7170: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
7180: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7190: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
71a0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
71b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
71c0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
71d0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
71e0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
71f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pTab;.      }els
7200: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
7210: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
7220: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
7230: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
7240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
7250: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
7260: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
7270: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  dIdx;.        as
7280: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
7290: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
72a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
72b0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
72c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
72d0: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
72e0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
72f0: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
7300: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a   = pTab->aCol;..
7310: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
7320: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
7330: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
7340: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
7350: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70    for(j=0; j < p
7360: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
7370: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
7380: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
7390: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
73a0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
73c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
73d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
73e0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
73f0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
7400: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7410: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
7420: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
7430: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7440: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
7450: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
7460: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7470: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
7480: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
7490: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
74a0: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
74b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
74c0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
74d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
74e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
74f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7500: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
7510: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7520: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
7530: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
7540: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
7550: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
7560: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
7570: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
7580: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
7590: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
75a0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
75b0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
75c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
75d0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
75e0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
75f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
7600: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
7610: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
7620: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7630: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
7640: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
7650: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
7660: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
7670: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
7680: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
7690: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
76a0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
76b0: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
76c0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
76d0: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
76e0: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
76f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
7700: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
7710: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
7720: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
7730: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
7740: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
7750: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
7760: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
7770: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
7780: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
7790: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
77a0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
77b0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
77c0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
77d0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
77e0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
77f0: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
7800: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
7810: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
7820: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
7830: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7840: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
7850: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7860: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
7870: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
7880: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
7890: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
78a0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
78b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
78c0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
78d0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
78e0: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
78f0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7900: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
7910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
7920: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
7930: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
7940: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
7950: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
7960: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
7970: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7980: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
7990: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
79a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
79b0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
79c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  pr);.          c
79d0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
79e0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
79f0: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
7a00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
7a10: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
7a20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a30: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
7a40: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
7a50: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
7a60: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
7a70: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
7a80: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
7a90: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
7aa0: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
7ab0: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
7ac0: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
7ad0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
7ae0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
7af0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
7b00: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
7b10: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
7b20: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
7b30: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
7b40: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
7b50: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
7b60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
7b70: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
7b80: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
7b90: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
7ba0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
7bb0: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
7bc0: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
7bd0: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
7be0: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
7bf0: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
7c00: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
7c10: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
7c20: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
7c30: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
7c40: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
7c50: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
7c60: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
7c70: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
7c80: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
7c90: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
7ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
7cb0: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
7cc0: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
7cd0: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
7ce0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
7cf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7d00: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7d10: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7d20: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
7d30: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
7d40: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
7d50: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
7d60: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
7d70: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
7d80: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
7d90: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
7da0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
7db0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
7dc0: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
7dd0: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
7de0: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
7df0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
7e00: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
7e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
7e20: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
7e30: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
7e40: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
7e50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7e60: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7e70: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7e80: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7e90: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
7ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
7eb0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
7ec0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
7ed0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ee0: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
7ef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
7f00: 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43  e(z);.    pTopNC
7f10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
7f20: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
7f30: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
7f40: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
7f50: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
7f60: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
7f70: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
7f80: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
7f90: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
7fa0: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
7fb0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
7fc0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
7fd0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
7fe0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
7ff0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
8000: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
8010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8020: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
8030: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
8040: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
8050: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
8060: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
8070: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
8080: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
8090: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
80a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
80b0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
80c0: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
80d0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
80e0: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
80f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
8100: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
8110: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
8120: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
8130: 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a  d |= 1<<n;.  }..
8140: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
8150: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
8160: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
8170: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
8180: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
8190: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
81a0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
81b0: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
81c0: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
81d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
81e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
81f0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
8200: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
8210: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
8220: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
8230: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
8240: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
8250: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8260: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
8270: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
8280: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43  arse, pExpr, pNC
8290: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
82a0: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
82b0: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
82c0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
82d0: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
82e0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
82f0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
8300: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
8310: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
8320: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
8330: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
8340: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
8350: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
8360: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
8370: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
8380: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
8390: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
83a0: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
83b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
83c0: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
83d0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
83e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
83f0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8400: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
8410: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8420: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
8430: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
8440: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
8450: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
8460: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
8470: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
8480: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
8490: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
84a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
84b0: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
84c0: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
84d0: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
84e0: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
84f0: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
8500: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8510: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
8520: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
8530: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
8540: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
8550: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
8560: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
8570: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
8580: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
8590: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
85a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
85b0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
85c0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
85d0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
85e0: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
85f0: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
8600: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
8610: 4c 69 73 74 3b 0a 20 20 50 61 72 73 65 20 2a 70  List;.  Parse *p
8620: 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70 45  Parse;..  if( pE
8630: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
8640: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  1;.  assert( pNC
8650: 21 3d 30 20 29 3b 0a 20 20 70 53 72 63 4c 69 73  !=0 );.  pSrcLis
8660: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8670: 74 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e  t;.  pParse = pN
8680: 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  C->pParse;..  if
8690: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
86a0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
86b0: 65 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72  esolved) ) retur
86c0: 6e 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72  n 1;.  ExprSetPr
86d0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
86e0: 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e  _Resolved);.#ifn
86f0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
8700: 20 70 53 72 63 4c 69 73 74 20 26 26 20 70 53 72   pSrcList && pSr
8710: 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20  cList->nAlloc>0 
8720: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
8730: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
8740: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
8750: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8760: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
8770: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
8780: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
8790: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
87a0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
87b0: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
87c0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
87d0: 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64  /* Double-quoted
87e0: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61   strings (ex: "a
87f0: 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73  bc") are used as
8800: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a   identifiers if.
8810: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
8820: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79    Otherwise they
8830: 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e   remain as strin
8840: 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74  gs.  Single-quot
8850: 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ed.    ** string
8860: 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72  s (ex: 'abc') ar
8870: 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20  e always string 
8880: 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f  literals..    */
8890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
88a0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
88b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
88c0: 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b  0]=='\'' ) break
88d0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
88e0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
88f0: 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73  _ID case if this
8900: 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f   is a double-quo
8910: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ted string */.  
8920: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e    }.    /* A lon
8930: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
8940: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
8950: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
8960: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
8970: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
8980: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
8990: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
89a0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
89b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
89c0: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
89d0: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
89e0: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
89f0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
8a00: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
8a10: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
8a20: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
8a30: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
8a40: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
8a50: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
8a60: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
8a70: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
8a80: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
8a90: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
8aa0: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
8ab0: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
8ac0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
8ad0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
8ae0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
8af0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
8b00: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
8b10: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
8b20: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
8b30: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
8b40: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
8b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b60: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
8b70: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
8b80: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
8b90: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
8ba0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
8bb0: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
8bc0: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
8bd0: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
8be0: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
8bf0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
8c00: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
8c10: 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c  arse, pDb, pTabl
8c20: 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, pColumn, pNC,
8c30: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
8c40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
8c50: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
8c60: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
8c70: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
8c80: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
8c90: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
8ca0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
8cb0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
8cc0: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
8cd0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
8ce0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
8cf0: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
8d00: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
8d10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8d20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
8d30: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
8d40: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
8d50: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
8d60: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
8d70: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
8d80: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
8d90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
8da0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
8db0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
8dc0: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8de0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
8df0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8e00: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
8e10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e40: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
8e50: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
8e60: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8e70: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
8e80: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
8e90: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
8ea0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8ec0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
8ed0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
8ee0: 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d  .      int enc =
8ef0: 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
8f00: 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
8f10: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
8f20: 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61        zId = (cha
8f30: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
8f40: 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70  z;.      nId = p
8f50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
8f60: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
8f70: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8f80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
8f90: 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   nId, n, enc, 0)
8fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
8fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
8fc0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
8fd0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
8fe0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
8ff0: 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  -1, enc, 0);.   
9000: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
9010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
9020: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
9030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9040: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e           wrong_n
9050: 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20  um_args = 1;.   
9060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9070: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  se{.        is_a
9080: 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63  gg = pDef->xFunc
9090: 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ==0;.      }.   
90a0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26     if( is_agg &&
90b0: 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20   !pNC->allowAgg 
90c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
90d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
90e0: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
90f0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
9100: 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49   %.*s()", nId,zI
9110: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
9120: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
9130: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
9140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
9150: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
9160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9170: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
9180: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
9190: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
91a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
91b0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
91c0: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
91d0: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
91e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
91f0: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
9200: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9210: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
9220: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
9230: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
9240: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
9250: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
9260: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b     if( is_agg ){
9270: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
9280: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
9290: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e  TION;.        pN
92a0: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
92c0: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61   is_agg ) pNC->a
92d0: 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20  llowAgg = 0;.   
92e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d     for(i=0; pNC-
92f0: 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b  >nErr==0 && i<n;
9300: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77   i++){.        w
9310: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73  alkExprTree(pLis
9320: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e  t->a[i].pExpr, n
9330: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
9340: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20   pNC);.      }. 
9350: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
9360: 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20  ) pNC->allowAgg 
9370: 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49  = 1;.      /* FI
9380: 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70  X ME:  Compute p
9390: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62  Expr->affinity b
93a0: 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65  ased on the expe
93b0: 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20  cted return.    
93c0: 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65    ** type of the
93d0: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20   function .     
93e0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
93f0: 20 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23   is_agg;.    }.#
9400: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9410: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
9420: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
9430: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
9440: 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63  TS:.#endif.    c
9450: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
9460: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
9470: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
9480: 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d   int nRef = pNC-
9490: 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53  >nRef;.#ifndef S
94a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
94b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
94c0: 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20  ->isCheck ){.   
94d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
94e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73  rorMsg(pParse,"s
94f0: 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62  ubqueries prohib
9500: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
9510: 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
9520: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
9530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
9540: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
9550: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
9560: 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20  t, pNC);.       
9570: 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52   assert( pNC->nR
9580: 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20  ef>=nRef );.    
9590: 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e      if( nRef!=pN
95a0: 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20  C->nRef ){.     
95b0: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
95c0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
95d0: 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  arSelect);.     
95e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
95f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9600: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9610: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61  MIT_CHECK.    ca
9620: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
9630: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  {.      if( pNC-
9640: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
9650: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9660: 4d 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61  Msg(pParse,"para
9670: 6d 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65  meters prohibite
9680: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
9690: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
96a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
96b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
96c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
96d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
96e0: 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65  e walks an expre
96f0: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72  ssion tree and r
9700: 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63  esolves referenc
9710: 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63  es to.** table c
9720: 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f  olumns.  Nodes o
9730: 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44  f the form ID.ID
9740: 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69   or ID resolve i
9750: 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20  nto an.** index 
9760: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  to the table in 
9770: 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61  the table list a
9780: 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73  nd a column offs
9790: 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70  et.  The .** Exp
97a0: 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63  r.opcode for suc
97b0: 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67  h nodes is chang
97c0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  ed to TK_COLUMN.
97d0: 20 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c    The Expr.iTabl
97e0: 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68  e.** value is ch
97f0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
9800: 65 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ex of the refere
9810: 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54  nced table in pT
9820: 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74  abList.** plus t
9830: 68 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e  he "base" value.
9840: 20 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65    The base value
9850: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
9860: 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56   become the.** V
9870: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
9880: 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  r for a cursor t
9890: 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  hat is pointing 
98a0: 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e  into the referen
98b0: 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54  ced.** table.  T
98c0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
98d0: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
98e0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
98f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20   the column .** 
9900: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
9910: 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  d table.  The Ex
9920: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
9930: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
9940: 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  .** ROWID column
9950: 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54   is -1.  Any INT
9960: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9970: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64   column is tried
9980: 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20   as an.** alias 
9990: 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a  for ROWID..**.**
99a0: 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75   Also resolve fu
99b0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64  nction names and
99c0: 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74   check the funct
99d0: 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a  ions for proper.
99e0: 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20  ** usage.  Make 
99f0: 73 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f  sure all functio
9a00: 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f  n names are reco
9a10: 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66  gnized and all f
9a20: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65  unctions.** have
9a30: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
9a40: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
9a50: 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f  .  Leave an erro
9a60: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
9a70: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
9a80: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
9a90: 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68  miss.  Return th
9aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
9ab0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
9ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
9ad0: 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66  ains aggregate f
9ae0: 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65  unctions then se
9af0: 74 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20  t the EP_Agg.** 
9b00: 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20  property on the 
9b10: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69  expression..*/.i
9b20: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  nt sqlite3ExprRe
9b30: 73 6f 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61  solveNames(.  Na
9b40: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
9b50: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
9b60: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
9b70: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
9b80: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
9b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9ba0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
9bb0: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
9bc0: 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61  ){.  int savedHa
9bd0: 73 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70  sAgg;.  if( pExp
9be0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
9bf0: 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20 3d  .  savedHasAgg =
9c00: 20 70 4e 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20   pNC->hasAgg;.  
9c10: 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b  pNC->hasAgg = 0;
9c20: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
9c30: 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c  pExpr, nameResol
9c40: 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20  verStep, pNC);. 
9c50: 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30   if( pNC->nErr>0
9c60: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
9c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9c80: 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20  P_Error);.  }.  
9c90: 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  if( pNC->hasAgg 
9ca0: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
9cb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9cc0: 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _Agg);.  }else i
9cd0: 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29  f( savedHasAgg )
9ce0: 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67  {.    pNC->hasAg
9cf0: 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 1;.  }.  ret
9d00: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
9d10: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
9d20: 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ror);.}../*.** A
9d30: 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63   pointer instanc
9d40: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
9d50: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70  ure is used to p
9d60: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ass information.
9d70: 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45  ** through walkE
9d80: 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64  xprTree into cod
9d90: 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e  eSubqueryStep().
9da0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
9db0: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75  ct QueryCoder Qu
9dc0: 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74  eryCoder;.struct
9dd0: 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20   QueryCoder {.  
9de0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
9df0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
9e00: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9e10: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
9e20: 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61  C;    /* Namespa
9e30: 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c  ce of first encl
9e40: 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d  osing query */.}
9e50: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ;.../*.** Genera
9e60: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
9e70: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
9e80: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
9e90: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
9ea0: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
9eb0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
9ec0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
9ed0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
9ee0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
9ef0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
9f00: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
9f10: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
9f20: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
9f40: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
9f50: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
9f60: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
9f70: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
9f80: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
9f90: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
9fa0: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
9fb0: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
9fc0: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
9fd0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
9fe0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
9ff0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
a000: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
a010: 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ery..*/.#ifndef 
a020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a030: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
a040: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
a050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
a060: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
a070: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
a0a0: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
a0b0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
a0c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
a0d0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
a0e0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
a0f0: 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20   This code must 
a100: 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e  be run in its en
a110: 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d  tirety every tim
a120: 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
a130: 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  red.  ** if any 
a140: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
a150: 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20   is true:.  **. 
a160: 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69   **    *  The ri
a170: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
a180: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
a190: 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a  bquery.  **    *
a1a0: 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
a1b0: 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72   side is an expr
a1c0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  ession list cont
a1d0: 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73  aining variables
a1e0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61  .  **    *  We a
a1f0: 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67  re inside a trig
a200: 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ger.  **.  ** If
a210: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
a220: 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65  e are false, the
a230: 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69  n we can run thi
a240: 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65  s code just once
a250: 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72  .  ** save the r
a260: 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73  esults, and reus
a270: 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  e the same resul
a280: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
a290: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a  invocations..  *
a2a0: 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  /.  if( !ExprHas
a2b0: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
a2c0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
a2d0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69   && !pParse->tri
a2e0: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e  gStack ){.    in
a2f0: 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  t mem = pParse->
a300: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
a310: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a320: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c  OP_MemLoad, mem,
a330: 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64   0);.    testAdd
a340: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
a350: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30  ddOp(v, OP_If, 0
a360: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
a370: 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20  ( testAddr>0 || 
a380: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
a390: 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  a()->mallocFaile
a3a0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
a3b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a3c0: 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b  MemInt, 1, mem);
a3d0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
a3e0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a3f0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
a400: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
a410: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
a420: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
a430: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
a440: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
a450: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 69  OP_OpenVirtual i
a460: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
a470: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
a480: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
a490: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
a4a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
a4b0: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
a4c0: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
a4d0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
a4e0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
a4f0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
a500: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
a510: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
a520: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
a530: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
a540: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
a550: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
a560: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
a570: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
a580: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
a590: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
a5a0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
a5b0: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
a5c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
a5d0: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
a5e0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
a5f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
a600: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
a610: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
a620: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
a630: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
a640: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
a650: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
a660: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
a670: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
a680: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
a690: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
a6a0: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
a6b0: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
a6c0: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
a6d0: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
a6e0: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
a6f0: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
a700: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
a710: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
a720: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
a730: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
a740: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
a750: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
a760: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
a770: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
a780: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a790: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
a7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a7b0: 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
a7c0: 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
a7d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  , 0);.      mems
a7e0: 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20  et(&keyInfo, 0, 
a7f0: 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29  sizeof(keyInfo))
a800: 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e  ;.      keyInfo.
a810: 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nField = 1;.    
a820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a830: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
a840: 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69  olumns, pExpr->i
a850: 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20  Table, 1);..    
a860: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
a870: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
a880: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
a890: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
a8a0: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
a8b0: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
a8c0: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
a8d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
a8e0: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
a8f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
a900: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
a910: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
a920: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
a930: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
a940: 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d  t iParm = pExpr-
a950: 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e  >iTable +  (((in
a960: 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29  t)affinity)<<16)
a970: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
a980: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
a990: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
a9a0: 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
a9b0: 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
a9c0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
a9d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
a9e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
a9f0: 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20  elect, SRT_Set, 
aa00: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
aa10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69  0);.        pELi
aa20: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  st = pExpr->pSel
aa30: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
aa40: 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
aa50: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
aa60: 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  >0 ){ .         
aa70: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
aa80: 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  ] = binaryCompar
aa90: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
aaa0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20   pExpr->pLeft,. 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c               pEL
aac0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
aad0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
aaf0: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
ab00: 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
ab10: 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72     expr IN (expr
ab20: 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a  list).        **
ab30: 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78  ..** For each ex
ab40: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
ab50: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
ab60: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
ab70: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
ab80: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
ab90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
aba0: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
abb0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
abc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
abd0: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
abe0: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
abf0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
ac00: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
ac10: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
ac20: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
ac30: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
ac40: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
ac50: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
ac60: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
ac70: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
ac80: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ac90: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a  t_item *pItem;..
aca0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
acb0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
acc0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
acd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
ace0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
acf0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
ad00: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
ad10: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
ad20: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
ad30: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
ad40: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
ad50: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
ad60: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
ad70: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
ad80: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
ad90: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
ada0: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
adb0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
adc0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
add0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
ade0: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
adf0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
ae00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
ae10: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
ae20: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
ae30: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
ae40: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
ae50: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
ae60: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
ae70: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
ae80: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
ae90: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
aea0: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
aeb0: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
aec0: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
aed0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
aee0: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
aef0: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
af00: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
af10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
af20: 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 73 71  VdbeOp *aOp = sq
af30: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
af40: 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20  , testAddr-1);. 
af50: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
af60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
af70: 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29  r(i=0; i<3; i++)
af80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
af90: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 3d 20  aOp[i].opcode = 
afa0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
afb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
afc0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b     testAddr = 0;
afd0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
aff0: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
b000: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
b010: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
b020: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
b030: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b040: 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  e(pParse, pE2);.
b050: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b060: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
b070: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
b080: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
b090: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b0a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b0b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
b0c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
b0d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b0f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
b100: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
b110: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
b120: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b130: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
b140: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
b150: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
b160: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
b170: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
b180: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
b190: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
b1a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
b1b0: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
b1c0: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
b1d0: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
b1e0: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
b1f0: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
b200: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
b210: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b220: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b  static const Tok
b230: 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29  en one = { (u8*)
b240: 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20  "1", 0, 1 };.   
b250: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
b260: 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b  .      int iMem;
b270: 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a  .      int sop;.
b280: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
b290: 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d 20 70  olumn = iMem = p
b2a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
b2b0: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
b2c0: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
b2d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
b2e0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
b2f0: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
b300: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
b310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b320: 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65   OP_MemNull, iMe
b330: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  m, 0);.        V
b340: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b350: 23 20 49 6e 69 74 20 73 75 62 71 75 65 72 79 20  # Init subquery 
b360: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
b370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b380: 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73  sop = SRT_Exists
b390: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b3a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b3b0: 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 4d 65 6d  _MemInt, 0, iMem
b3c0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b3d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e  omment((v, "# In
b3e0: 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
b3f0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
b400: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b410: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69  lete(pSel->pLimi
b420: 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
b430: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
b440: 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c  Expr(TK_INTEGER,
b450: 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20   0, 0, &one);.  
b460: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
b470: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
b480: 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c  sop, iMem, 0, 0,
b490: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
b4a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
b4b0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29    if( testAddr )
b4c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b4d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
b4e0: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  tAddr);.  }.  re
b4f0: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
b500: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
b510: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
b520: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
b530: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
b540: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
b550: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
b560: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
b570: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
b580: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
b590: 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a  deInteger(Vdbe *
b5a0: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
b5b0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
b5c0: 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  i;.  if( sqlite3
b5d0: 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20  GetInt32(z, &i) 
b5e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b5f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b600: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
b610: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
b620: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29  3FitsIn64Bits(z)
b630: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b640: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74  dbeOp3(v, OP_Int
b650: 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  64, 0, 0, z, n);
b660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b670: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b680: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
b690: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , n);.  }.}../*.
b6a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b6b0: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
b6c0: 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
b6d0: 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
b6e0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c  expression and l
b6f0: 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20  eave the result 
b700: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74  on the top of st
b710: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
b720: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
b730: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
b740: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
b750: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
b760: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
b770: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
b780: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
b790: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
b7a0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
b7b0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
b7c0: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
b7d0: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
b7e0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
b7f0: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
b800: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
b810: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
b820: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
b830: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
b840: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
b850: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
b860: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
b870: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
b880: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
b890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b8a0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
b8b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
b8c0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  pVdbe;.  int op;
b8d0: 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e 67  .  int stackChng
b8e0: 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f 75   = 1;    /* Amou
b8f0: 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f 20  nt of change to 
b900: 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a 0a  stack depth */..
b910: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
b920: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
b930: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b940: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b950: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
b960: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b970: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
b980: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
b990: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
b9a0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
b9b0: 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
b9c0: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
b9d0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
b9e0: 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
b9f0: 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
ba00: 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
ba10: 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
ba20: 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
ba30: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
ba40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba50: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
ba60: 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  pCol->iMem, 0);.
ba70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ba80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ba90: 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
baa0: 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
bab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bac0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
bad0: 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
bae0: 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
bb10: 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  erColumn);.     
bb20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bb30: 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
bb40: 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
bb50: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
bb60: 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
bb70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
bb80: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
bb90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
bba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
bbb0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
bbc0: 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
bbd0: 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
bbe0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
bbf0: 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
bc00: 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  et>0 );.        
bc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bc20: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61 72  (v, OP_Dup, pPar
bc30: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78  se->ckOffset-pEx
bc40: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31  pr->iColumn-1, 1
bc50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bc60: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
bc70: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
bc80: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
bc90: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
bca0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
bcb0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
bcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bcd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
bce0: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
bcf0: 6c 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  le, iCol);.     
bd00: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
bd10: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
bd20: 20 69 43 6f 6c 29 3b 0a 23 69 66 6e 64 65 66 20   iCol);.#ifndef 
bd30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
bd40: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
bd50: 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70     if( pTab && p
bd60: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
bd70: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
bd80: 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20  _AFF_REAL ){.   
bd90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bda0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
bdb0: 61 6c 41 66 66 69 6e 69 74 79 2c 20 30 2c 20 30  alAffinity, 0, 0
bdc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
bdd0: 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
bde0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bdf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
be00: 52 6f 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54  Rowid, pExpr->iT
be10: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
be20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
be30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
be40: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
be50: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
be60: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
be70: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
be80: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
be90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bea0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
beb0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
bec0: 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
bed0: 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f  t( TK_FLOAT==OP_
bee0: 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Real );.      as
bef0: 73 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d  sert( TK_STRING=
bf00: 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20  =OP_String8 );. 
bf10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
bf20: 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a  oteExpr(pExpr);.
bf30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bf40: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
bf50: 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  , (char*)pExpr->
bf60: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
bf70: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
bf80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bf90: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
bfa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bfb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
bfc0: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
bfd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
bfe0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bff0: 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
c000: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
c010: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
c020: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
c030: 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *z;.      asser
c040: 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48  t( TK_BLOB==OP_H
c050: 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  exBlob );.      
c060: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
c070: 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20  .n - 3;.      z 
c080: 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
c090: 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20  token.z + 2;.   
c0a0: 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20     assert( n>=0 
c0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
c0c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d  0 ){.        z =
c0d0: 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   "";.      }.   
c0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c0f0: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  3(v, op, 0, 0, z
c100: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , n);.      brea
c110: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
c120: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
c130: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
c140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c150: 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
c160: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
c170: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
c180: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a  r->token.n>1 ){.
c190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c1a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
c1b0: 31 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  1, (char*)pExpr-
c1c0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
c1d0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
c1e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c1f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c200: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
c210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c220: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
c230: 61 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ad, pExpr->iTabl
c240: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 0);.      bre
c250: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
c270: 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
c280: 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
c290: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
c2a0: 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
c2b0: 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
c2c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
c2d0: 2c 20 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  , op;.      sqli
c2e0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c2f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c300: 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
c310: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c320: 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  pe(&pExpr->token
c330: 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 66  );.      op = af
c340: 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
c350: 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
c360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
c370: 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
c380: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c390: 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
c3a0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
c3b0: 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
c3c0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c3d0: 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
c3e0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
c3f0: 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
c400: 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
c410: 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
c420: 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 49  sert( op==OP_ToI
c430: 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
c440: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c450: 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
c460: 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  t( op==OP_ToReal
c470: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
c480: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
c490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c4a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
c4b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61  0, 0);.      sta
c4c0: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
c4d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c4e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c4f0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
c500: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
c510: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
c520: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
c530: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
c540: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
c550: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
c560: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c570: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
c580: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
c590: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
c5a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
c5b0: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
c5c0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
c5d0: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
c5e0: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
c5f0: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
c600: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
c610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c620: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c630: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c650: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c660: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c670: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
c680: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c690: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
c6a0: 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  ght, op, 0, 0);.
c6b0: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
c6c0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
c6d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c6e0: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
c6f0: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
c700: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
c710: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
c720: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
c730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
c740: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
c750: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
c760: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
c770: 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
c780: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
c790: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
c7a0: 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
c7b0: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
c7c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
c7d0: 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
c7e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
c7f0: 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
c800: 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
c810: 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
c820: 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
c830: 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
c840: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c850: 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
c860: 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
c870: 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
c880: 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
c890: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
c8a0: 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
c8b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c8c0: 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
c8d0: 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
c8e0: 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
c8f0: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
c900: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c910: 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
c920: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
c930: 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
c940: 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
c950: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c960: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c970: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c990: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c9a0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c9b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c9c0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
c9d0: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
c9e0: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
c9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ca00: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
ca10: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
ca20: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
ca30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
ca40: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
ca50: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
ca60: 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f  LOAT || pLeft->o
ca70: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
ca80: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
ca90: 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  p = &pLeft->toke
caa0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
cab0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  *z = sqlite3MPri
cac0: 6e 74 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e  ntf("-%.*s", p->
cad0: 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  n, p->z);.      
cae0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
caf0: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
cb00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cb10: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
cb20: 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b  , 0, 0, z, p->n+
cb30: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
cb40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
cb50: 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70  eInteger(v, z, p
cb60: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
cb70: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
cb80: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
cb90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
cba0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
cbb0: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
cbc0: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
cbd0: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
cbe0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
cbf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cc00: 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
cc10: 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
cc20: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
cc30: 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71  _Not );.      sq
cc40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cc50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
cc60: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
cc70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
cc80: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
cc90: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
cca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ccb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
ccc0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
ccd0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
cce0: 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20     int dest;.   
ccf0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
cd00: 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
cd10: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd20: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
cd30: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
cd40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cd50: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
cd60: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
cd70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cd80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
cd90: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
cda0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
cdb0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
cdc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cdd0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
cde0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
cdf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce00: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
ce10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
ce20: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
ce30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ce40: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
ce50: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
ce60: 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
ce70: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
ce80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
ce90: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
cea0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ceb0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
cec0: 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54  of aggregate: %T
ced0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ",.            &
cee0: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
cef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf10: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
cf20: 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  d, pInfo->aFunc[
cf30: 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
cf40: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
cf50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf60: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
cf70: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
cf80: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
cf90: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
cfa0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
cfb0: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
cfc0: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
cfd0: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
cfe0: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
cff0: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
d000: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
d010: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
d020: 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
d030: 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
d040: 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
d050: 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
d060: 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  db);.      CollS
d070: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
d080: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
d090: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
d0a0: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
d0b0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
d0c0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
d0d0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
d0e0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
d0f0: 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
d100: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
d110: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
d120: 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
d130: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
d140: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
d150: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  t);.      for(i=
d160: 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
d170: 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
d180: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
d190: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
d1a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
d1c0: 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b  tMask |= (1<<i);
d1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1e0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
d1f0: 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
d200: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
d210: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
d220: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
d230: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
d240: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
d250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d260: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
d270: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
d280: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
d290: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
d2a0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
d2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d2c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
d2d0: 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
d2e0: 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
d2f0: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
d300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d310: 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  3(v, OP_Function
d320: 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78  , constMask, nEx
d330: 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  pr, (char*)pDef,
d340: 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
d350: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
d360: 31 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62  1-nExpr;.      b
d370: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
d380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d390: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
d3a0: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
d3b0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
d3c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
d3d0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d3e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
d3f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d400: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
d410: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
d420: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  mn, 0);.      Vd
d430: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
d440: 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72   load subquery r
d450: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
d460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d470: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
d480: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
d490: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
d4a0: 74 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ty;.      sqlite
d4b0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
d4c0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a  Parse, pExpr);..
d4d0: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
d4e0: 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
d4f0: 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
d500: 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
d510: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
d520: 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
d530: 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
d540: 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
d550: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
d560: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33   for.      ** P3
d570: 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
d580: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
d590: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d    affinity = com
d5a0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
d5b0: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73  pExpr);..      s
d5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d5d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
d5e0: 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
d5f0: 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20  Code the <expr> 
d600: 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
d610: 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70  (...)". The temp
d620: 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20  orary table.    
d630: 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
d640: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
d650: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
d660: 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   up the (...) se
d670: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
d680: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d690: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d6a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
d6b0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d6c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d6e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
d6f0: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b  tNull, -1, addr+
d700: 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  4);            /
d710: 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20  * addr + 0 */.  
d720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d730: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
d740: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
d750: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d760: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
d770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d780: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
d790: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
d7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7b0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
d7c0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
d7d0: 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a  finity, 1);   /*
d7e0: 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
d7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d800: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
d810: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
d820: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
d830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d840: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
d850: 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  , 0);           
d860: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
d870: 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65   6 */..      bre
d880: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
d890: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
d8a0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
d8b0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
d8c0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
d8d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d8e0: 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
d8f0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a  Expr->pList->a;.
d900: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
d910: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
d920: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
d930: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d940: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
d950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d960: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
d970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d980: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d990: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
d9a0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
d9b0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
d9c0: 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b  t, OP_Ge, 0, 0);
d9d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d9e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
d9f0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
da00: 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
da10: 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
da20: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
da30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
da40: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
da50: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
da60: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
da70: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
da80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
da90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
daa0: 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a   OP_And, 0, 0);.
dab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dac0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
dad0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
dae0: 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
daf0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
db00: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
db10: 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b  ft);.      stack
db20: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
db30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
db40: 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
db50: 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f  .      int expr_
db60: 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20  end_label;.     
db70: 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20   int jumpInst;. 
db80: 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
db90: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
dba0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
dbb0: 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  ist;.      struc
dbc0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
dbd0: 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20  *aListelem;..   
dbe0: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
dbf0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
dc00: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
dc10: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
dc20: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
dc30: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
dc40: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
dc50: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
dc60: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
dc70: 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
dc80: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
dc90: 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
dca0: 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f  xpr;.      expr_
dcb0: 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69  end_label = sqli
dcc0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
dcd0: 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (v);.      if( p
dce0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
dcf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dd00: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dd10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
dd20: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
dd30: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d  i=0; i<nExpr; i=
dd40: 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
dd50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
dd60: 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
dd70: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
dd80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
dd90: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
dda0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ddb0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
ddc0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
ddd0: 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d  mpInst = codeCom
dde0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
ddf0: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74  pr->pLeft, aList
de00: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20  elem[i].pExpr,. 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  OP_Ne, 0, 1);.  
de40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
de50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
de60: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
de70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de80: 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73      jumpInst = s
de90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
dea0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20  v, OP_IfNot, 1, 
deb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
dec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ded0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
dee0: 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
def0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
df00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
df10: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70   OP_Goto, 0, exp
df20: 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
df30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df40: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d  eJumpHere(v, jum
df50: 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pInst);.      }.
df60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
df70: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
df80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df90: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
dfa0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
dfb0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
dfc0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
dfd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
dfe0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
dff0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65  Right);.      }e
e000: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
e010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e020: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
e030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e040: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e050: 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65  eLabel(v, expr_e
e060: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
e070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
e080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e090: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
e0a0: 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
e0b0: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
e0c0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
e0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
e0e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
e110: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
e120: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
e130: 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74  -program");..ret
e140: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
e150: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
e160: 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65  olumn!=OE_Ignore
e170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
e180: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
e190: 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  umn==OE_Rollback
e1a0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
e1b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
e1c0: 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
e1d0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
e1e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
e1f0: 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b  mn == OE_Fail );
e200: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
e210: 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78  3DequoteExpr(pEx
e220: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
e230: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
e240: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
e250: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
e260: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
e290: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
e2a0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
e2b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e2c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
e2d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
e2e0: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
e2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e300: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
e310: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
e320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
e340: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
e350: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
e360: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
e370: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e380: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
e390: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
e3a0: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
e3b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e3c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
e3d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
e3e0: 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  kOffset ){.    p
e3f0: 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
e400: 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20  += stackChng;.  
e410: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
e420: 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20  ->ckOffset );.  
e430: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
e440: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
e450: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
e460: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
e470: 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
e480: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
e490: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
e4a0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
e4b0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
e4c0: 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a  ExprCode()..**.*
e4d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
e4e0: 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20  ight also cache 
e4f0: 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d  the result and m
e500: 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20  odify the pExpr 
e510: 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  tree.** so that 
e520: 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65  it will make use
e530: 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72   of the cached r
e540: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
e550: 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a  ent evaluations.
e560: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  ** rather than e
e570: 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c  valuate the whol
e580: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
e590: 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70  in.  Trivial exp
e5a0: 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
e5b0: 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20  not cached.  If 
e5c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
e5d0: 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65  s cached, its re
e5e0: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
e5f0: 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c  n a .** memory l
e600: 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ocation..*/.void
e610: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e620: 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
e630: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e640: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
e650: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e660: 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
e670: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
e680: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
e690: 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20  turn;.  addr1 = 
e6a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e6b0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c  ntAddr(v);.  sql
e6c0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e6d0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61  rse, pExpr);.  a
e6e0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
e6f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e700: 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
e710: 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33  dr1+1 || sqlite3
e720: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
e730: 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  r1)->opcode==OP_
e740: 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
e750: 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  iMem = pExpr->iT
e760: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
e770: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
e780: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e790: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
e7a0: 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  , 0);.    pExpr-
e7b0: 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
e7c0: 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  R;.  }.}.#endif.
e7d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
e7e0: 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
e7f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
e800: 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
e810: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
e820: 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f  ession list onto
e830: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
e840: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
e850: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
e860: 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
e870: 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stack..*/.int sq
e880: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
e890: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
e8a0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
e8b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e8c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e8d0: 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ist    /* The ex
e8e0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
e8f0: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a   be coded */.){.
e900: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e910: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
e920: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
e930: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
e940: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
e950: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
e960: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
e970: 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  i=n; i>0; i--, p
e980: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
e990: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e9a0: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
e9b0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
e9c0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
e9d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
e9e0: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
e9f0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
ea00: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
ea10: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
ea20: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
ea30: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
ea40: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
ea50: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
ea60: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
ea70: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
ea80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ea90: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
eaa0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
eab0: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
eac0: 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
ead0: 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
eae0: 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
eaf0: 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
eb00: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
eb10: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
eb20: 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
eb30: 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
eb40: 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
eb50: 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
eb60: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
eb70: 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
eb80: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
eb90: 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
eba0: 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
ebb0: 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
ebc0: 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
ebd0: 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
ebe0: 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
ebf0: 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
ec00: 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
ec10: 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
ec20: 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
ec30: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
ec40: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
ec50: 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
ec60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
ec70: 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
ec80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
ec90: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
eca0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
ecb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ecc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
ecd0: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
ece0: 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
ecf0: 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
ed00: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
ed10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
ed20: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
ed30: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
ed40: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
ed50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
ed60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ed70: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ed80: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
ed90: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
eda0: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
edb0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
edc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
edd0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
ede0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
edf0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ee00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ee10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
ee20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ee30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ee40: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
ee50: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
ee60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ee70: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
ee80: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
ee90: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
eea0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
eeb0: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
eec0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
eed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
eee0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
eef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ef00: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
ef10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
ef20: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
ef30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ef40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ef50: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
ef60: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
ef70: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
ef80: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
ef90: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
efa0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
efb0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
efc0: 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
efd0: 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
efe0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
eff0: 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
f000: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f010: 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
f020: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
f030: 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
f040: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
f050: 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
f060: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f070: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f080: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
f090: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f0a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
f0b0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
f0c0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
f0d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
f0e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
f0f0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f100: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
f110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f120: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
f130: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
f140: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
f150: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
f160: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
f170: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
f180: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
f190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f1a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f1b0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f1d0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
f1e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f1f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f200: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
f210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f220: 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
f230: 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
f240: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
f250: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
f260: 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
f270: 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
f280: 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
f290: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
f2a0: 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
f2b0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
f2c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
f2d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
f2e0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
f2f0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
f300: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f320: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f330: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
f340: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f350: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
f360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f370: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
f380: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
f390: 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
f3a0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
f3b0: 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
f3c0: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
f3d0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
f3e0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
f3f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
f400: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f410: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
f420: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
f430: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
f440: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
f450: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
f460: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
f470: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f480: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
f490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4a0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f4b0: 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
f4c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f4d0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
f4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f4f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f510: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f520: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
f530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f540: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
f550: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
f560: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f570: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
f580: 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
f590: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f5a0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
f5b0: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
f5c0: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
f5d0: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
f5e0: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
f5f0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f600: 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
f610: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
f620: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
f630: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
f640: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
f650: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
f660: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
f670: 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
f680: 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
f690: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
f6a0: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
f6b0: 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
f6c0: 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
f6d0: 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
f6e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
f6f0: 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
f700: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
f710: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
f720: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
f730: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f740: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f750: 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b  op = 0;.  int ck
f760: 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
f770: 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  >ckOffset;.  if(
f780: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
f790: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
f7a0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
f7b0: 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
f7c0: 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
f7d0: 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
f7e0: 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
f7f0: 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
f800: 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
f810: 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
f820: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
f830: 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
f840: 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
f850: 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
f860: 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
f870: 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
f880: 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
f890: 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
f8a0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
f8c0: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
f8d0: 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
f8e0: 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
f8f0: 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
f900: 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
f910: 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
f920: 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
f930: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
f950: 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
f960: 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
f970: 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
f980: 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
f990: 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
f9a0: 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
f9b0: 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
f9c0: 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
f9d0: 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
f9e0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
f9f0: 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
fa00: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
fa10: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
fa20: 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
fa30: 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
fa40: 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
fa50: 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
fa60: 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
fa70: 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
fa80: 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
fa90: 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
faa0: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
fab0: 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
fac0: 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
fad0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
fae0: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
faf0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
fb00: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fb10: 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
fb20: 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
fb30: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
fb40: 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
fb50: 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
fb60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
fb70: 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
fb80: 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
fb90: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
fba0: 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
fbb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
fbc0: 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
fbd0: 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
fbe0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fbf0: 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
fc00: 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
fc10: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fc20: 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
fc30: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
fc40: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
fc50: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
fc60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
fc70: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
fc80: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
fc90: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
fca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fcb0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
fcc0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
fcd0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
fce0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
fcf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fd00: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
fd10: 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
fd20: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
fd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fd40: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
fd50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
fd60: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
fd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fd80: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
fd90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
fda0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
fdb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fdc0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fdd0: 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
fde0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fdf0: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
fe00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fe10: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
fe20: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
fe30: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
fe40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fe50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
fe60: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
fe70: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
fe80: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
fe90: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
fea0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
feb0: 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
fec0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fed0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
fee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fef0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ff00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
ff10: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
ff20: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ff30: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
ff40: 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
ff50: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ff60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ff70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
ff80: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
ff90: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
ffa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ffb0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ffc0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
ffd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ffe0: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
fff0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10000 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10010 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
10020 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
10030 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
10040 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
10050 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
10060 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
10070 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
10080 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
10090 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
100a0 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
100b0 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
100c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
100d0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
100e0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
100f0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
10100 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
10110 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
10120 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
10130 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10140 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
10150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10160 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
10170 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
10180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
10190 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
101a0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
101b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
101c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63  Addr(v);.      c
101d0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
101e0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
101f0 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c  , OP_Ge, addr+3,
10200 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
10210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10220 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
10230 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
10240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10250 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
10260 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67  est);.      pRig
10270 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
10280 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
10290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
102a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
102b0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
102c0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
102d0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
102e0 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Gt, dest, jump
102f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
10300 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10310 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
10320 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10330 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
10340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10350 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
10360 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
10370 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
10380 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
10390 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
103a0 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a  t = ckOffset;.}.
103b0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
103c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
103d0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
103e0 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
103f0 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
10400 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
10410 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
10420 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
10430 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
10440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10450 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
10460 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
10470 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10480 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pA==0 ){.    ret
10490 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c  urn pB==0;.  }el
104a0 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a  se if( pB==0 ){.
104b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
104c0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
104d0 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
104e0 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  0;.  if( (pA->fl
104f0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
10500 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
10510 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
10520 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10530 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
10540 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
10550 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
10560 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
10570 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10580 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
10590 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
105a0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
105b0 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
105c0 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
105d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
105e0 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
105f0 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
10600 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
10610 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
10620 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
10630 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
10640 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
10650 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
10660 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
10670 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10680 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10690 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
106a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
106b0 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
106c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
106d0 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
106e0 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
106f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10700 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
10710 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
10720 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
10730 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
10740 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65  ;.  if( pA->toke
10750 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
10760 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
10770 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
10780 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
10790 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
107a0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
107b0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
107c0 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e  char*)pA->token.
107d0 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b  z,(char*)pB->tok
107e0 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  en.z,pB->token.n
107f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
10800 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10810 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
10820 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
10830 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
10840 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
10850 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
10860 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
10870 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
10880 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
10890 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
108a0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
108b0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
108c0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49  gInfoColumn(AggI
108d0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
108e0 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69  nt i;.  i = sqli
108f0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
10900 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d  ((void**)&pInfo-
10910 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66 28 70 49  >aCol, sizeof(pI
10920 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 20 33  nfo->aCol[0]), 3
10930 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
10940 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
10950 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
10960 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
10970 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
10980 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
10990 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
109a0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
109b0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
109c0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
109d0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
109e0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
109f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a00 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 41  addAggInfoFunc(A
10a10 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
10a20 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73    int i;.  i = s
10a30 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
10a40 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e  ate((void**)&pIn
10a50 66 6f 2d 3e 61 46 75 6e 63 2c 20 73 69 7a 65 6f  fo->aFunc, sizeo
10a60 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
10a70 5d 29 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 3c  ]), 2);.  if( i<
10a80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10a90 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
10aa0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
10ab0 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
10ac0 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
10ad0 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
10ae0 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
10af0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
10b00 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
10b10 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
10b20 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
10b30 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10b40 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
10b50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10b60 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
10b70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
10b80 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
10b90 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
10ba0 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
10bb0 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
10bc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
10bd0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
10be0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
10bf0 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
10c00 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
10c10 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
10c20 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
10c30 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
10c40 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
10c50 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  NC->pAggInfo;.  
10c60 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
10c70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
10c80 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
10c90 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
10ca0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
10cb0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
10cc0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
10cd0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
10ce0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
10cf0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
10d00 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
10d10 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
10d20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10d30 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
10d40 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
10d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
10d60 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
10d70 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
10d80 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
10d90 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
10da0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
10db0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
10dc0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
10dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10de0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
10df0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
10e00 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
10e10 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
10e20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
10e30 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
10e40 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
10e50 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
10e60 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
10e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
10e80 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
10e90 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
10ea0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
10eb0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
10ec0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
10ed0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
10ee0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
10ef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10f00 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
10f10 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
10f20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
10f30 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
10f40 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
10f60 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
10f70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
10fa0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
10fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10fc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ff0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
11000 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  nfo->nColumn && 
11010 28 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (i = addAggInfoC
11020 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66 6f 29 29  olumn(pAggInfo))
11030 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
11040 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
11050 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a  gInfo->aCol[i];.
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11070 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
11080 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
11090 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
110a0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
110b0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
110c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
110d0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
110e0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
110f0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
11100 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
11110 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11120 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11140 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
11150 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
11160 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
11170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11180 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
11190 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
111a0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
111b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
111c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
111d0 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
111e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
111f0 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
11200 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
11210 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
11220 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
11230 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
11240 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
11250 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
11260 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
11270 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11280 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
11290 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
112c0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
112d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
112f0 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11320 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
11360 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
11370 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
11380 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
11390 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
113a0 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
113b0 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
113c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
113d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
113e0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
113f0 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
11400 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
11410 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
11420 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
11430 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
11440 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
11450 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
11460 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
11470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
11480 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
11490 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
114a0 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
114b0 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
114c0 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
114d0 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
114e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
114f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11500 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
11510 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
11520 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
11530 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
11540 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
11550 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
11560 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11570 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
11580 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
11590 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
115a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
115b0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
115c0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
115d0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
115e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
115f0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
11600 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
11610 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  e pNC->nDepth==0
11620 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67   test causes agg
11630 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11640 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20   in subqueries. 
11650 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67       ** to be ig
11660 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  nored */.      i
11670 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
11680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
11690 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
116a0 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
116b0 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
116c0 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
116d0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
116e0 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
116f0 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
11700 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
11710 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
11720 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
11730 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
11740 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
11750 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
11760 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
11770 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11780 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
11790 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
117a0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
117b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
117c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
117d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
117e0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
117f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
11800 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
11810 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
11820 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
11830 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
11840 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
11850 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
11860 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
11870 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
11880 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
11890 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29 3b  oFunc(pAggInfo);
118a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
118b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
118c0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
118d0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
118e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
118f0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
11900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
11910 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  tem->iMem = pPar
11920 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11930 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
11940 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
11950 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
11960 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
11970 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11980 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
11990 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
119a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119b0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
119c0 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
119d0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
119e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
119f0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
11a00 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
11a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11a20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
11a30 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
11a40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11a60 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
11a70 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
11a80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
11aa0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
11ab0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
11ac0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
11ad0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
11ae0 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
11af0 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
11b00 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
11b10 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
11b20 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
11b30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
11b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b50 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69   }..  /* Recursi
11b60 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65  vely walk subque
11b70 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ries looking for
11b80 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
11b90 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20   that need.  ** 
11ba0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  to be changed to
11bb0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
11bc0 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e   But increment n
11bd0 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20  Depth so that.  
11be0 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ** TK_AGG_FUNCTI
11bf0 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71  ON nodes in subq
11c00 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75  ueries will be u
11c10 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
11c20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
11c30 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
11c40 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
11c50 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
11c60 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
11c70 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
11c80 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
11c90 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
11ca0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11cb0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
11cc0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
11cd0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
11ce0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
11cf0 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
11d00 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
11d10 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
11d20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
11d30 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
11d40 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
11d50 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
11d60 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
11d70 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
11d80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
11d90 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
11da0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
11db0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
11dc0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
11dd0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11de0 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
11df0 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
11e00 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
11e10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11e20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
11e30 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
11e40 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
11e50 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
11e60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11e70 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
11e80 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
11e90 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43    int nErr = pNC
11ea0 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  ->pParse->nErr;.
11eb0 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
11ec0 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67  Expr, analyzeAgg
11ed0 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
11ee0 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72  return pNC->pPar
11ef0 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b  se->nErr - nErr;
11f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
11f10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
11f20 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
11f30 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
11f40 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
11f50 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
11f60 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
11f70 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
11f80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
11f90 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
11fa0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
11fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11fc0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
11fd0 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
11fe0 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
11ff0 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
12000 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
12010 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
12020 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
12030 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
12040 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
12050 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d  t->a, i=0; nErr=
12060 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  =0 && i<pList->n
12070 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
12080 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72 20  ++){.      nErr 
12090 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  += sqlite3ExprAn
120a0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
120b0 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
120c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
120d0 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a     return nErr;.}.