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

Artifact 62cfa7d8b3debc85495e61df03930e7fdfc2a80c:


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 30 31 20 32 30 30 35 2f 30 35 2f 32 34 20  .201 2005/05/24 
0220: 31 32 3a 30 31 3a 30 32 20 64 61 6e 69 65 6c 6b  12:01:02 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 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
04c0: 4b 5f 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75  K_AS ){.    retu
04d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
04e0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
04f0: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
0500: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0570: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0590: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
05a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
05b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
05c0: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
05d0: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
05e0: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
05f0: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0600: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0610: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0620: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
0630: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
0640: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
0650: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
0660: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
0670: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
0680: 3e 6f 70 3d 3d 54 4b 5f 41 53 20 26 26 20 21 70  >op==TK_AS && !p
0690: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
06a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
06b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
06c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
06d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
06e0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
06f0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0700: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0710: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0720: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0730: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0740: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0750: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0760: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0770: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0780: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0790: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
07a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
07b0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
07c0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
07d0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
07e0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
07f0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0800: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0810: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0820: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0830: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0840: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0850: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0860: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0870: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0880: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0890: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
08a0: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
08b0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
08c0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
08d0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
08e0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
08f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0900: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0910: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
0920: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0930: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0940: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
0950: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
0960: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
0970: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0980: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0990: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
09a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
09b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
09c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
09d0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
09e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
09f0: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a00: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a10: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0a30: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0a40: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0a50: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0a60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0a70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0a80: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0a90: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0aa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0ab0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0ac0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0ad0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0ae0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0af0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b00: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b10: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0b20: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0b30: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0b40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0b50: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0b60: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0b70: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0b80: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0b90: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0ba0: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0bb0: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0bc0: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0bd0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0bf0: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0c10: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0c20: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0c30: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0c40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0c50: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0c60: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0c70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0c80: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0c90: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0ca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0cb0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0cd0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0ce0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0cf0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0d00: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0d10: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0d20: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0d30: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0d40: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0d50: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0d60: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0d70: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0d80: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0d90: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0da0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0db0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0dc0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0dd0: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
0de0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  aff;.}../*.** pE
0df0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0e00: 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  son expression, 
0e10: 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e  eg. '=', '<', IN
0e20: 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64  (...) etc..** id
0e30: 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68  x_affinity is th
0e40: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e  e affinity of an
0e50: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e   indexed column.
0e60: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
0e70: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  if the index wit
0e80: 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61  h affinity idx_a
0e90: 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75  ffinity may be u
0ea0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0eb0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
0ec0: 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  on in pExpr..*/.
0ed0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0ee0: 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20  AffinityOk(Expr 
0ef0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78  *pExpr, char idx
0f00: 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68  _affinity){.  ch
0f10: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
0f20: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
0f30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20  r);.  return .  
0f40: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
0f50: 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20  FF_NONE) ||.    
0f60: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0f70: 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f  _NUMERIC && idx_
0f80: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
0f90: 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c  _AFF_INTEGER) ||
0fa0: 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54  .    (aff==SQLIT
0fb0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26  E_AFF_INTEGER &&
0fc0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
0fd0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0fe0: 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d  C) ||.    (aff==
0ff0: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
1000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1010: 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74  he P1 value that
1020: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1030: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1040: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1050: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1060: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1070: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1080: 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a   pExpr2..** If j
1090: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
10a0: 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  e, then set the 
10b0: 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20  low byte of the 
10c0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76  returned.** P1 v
10d0: 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65  alue to tell the
10e0: 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20   opcode to jump 
10f0: 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  if either expres
1100: 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  sion.** evaluate
1110: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  s to NULL..*/.st
1120: 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43  atic int binaryC
1130: 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70  ompareP1(Expr *p
1140: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
1150: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
1160: 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ull){.  char aff
1170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1180: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1190: 20 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29    return (((int)
11a0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
11b0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
11c0: 66 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66  ff))<<8)+(jumpIf
11d0: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Null?1:0);.}../*
11e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
11f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1200: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1210: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1220: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1230: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1240: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1250: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1270: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1280: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1290: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
12a0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
12b0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
12c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
12d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
12e0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
12f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1300: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1310: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1320: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1330: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1340: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
1350: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
1360: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1380: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1390: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
13a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
13b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13c0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
13d0: 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29  ;.  if( !pColl )
13e0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
13f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1400: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1420: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1430: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1440: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1450: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
1460: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
1470: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1480: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
1490: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
14a0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
14b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
14c0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
14d0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
14e0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
14f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1500: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1510: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
1520: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
1530: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
1540: 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1550: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1560: 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e  f true.  */.  in
1570: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1580: 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70  /* If true, jump
1590: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
15a0: 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  nd is NULL */.){
15b0: 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61  .  int p1 = bina
15c0: 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66  ryCompareP1(pLef
15d0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
15e0: 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65  fNull);.  CollSe
15f0: 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f  q *p3 = binaryCo
1600: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1610: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1620: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ht);.  return sq
1630: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50 61  lite3VdbeOp3(pPa
1640: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
1650: 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76  de, p1, dest, (v
1660: 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c  oid*)p3, P3_COLL
1670: 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  SEQ);.}../*.** C
1680: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1690: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
16a0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
16b0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
16c0: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
16d0: 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ode is obtained 
16e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
16f0: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
1700: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
1710: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1720: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
1730: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
1740: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a   gets freed..*/.
1750: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1760: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
1770: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1780: 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  ght, const Token
1790: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
17a0: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
17b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17c0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
17d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17e0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
17f0: 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74  loc fails, delet
1800: 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  e pLeft and pRig
1810: 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20  ht. Expressions 
1820: 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a  passed to .    *
1830: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1840: 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61  must always be a
1850: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71  llocated with sq
1860: 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20  lite3Expr() for 
1870: 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61  this .    ** rea
1880: 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  son. .    */.   
1890: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18a0: 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  te(pLeft);.    s
18b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18c0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
18d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
18e0: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
18f0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1900: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1910: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70  ht = pRight;.  p
1920: 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a  New->iAgg = -1;.
1930: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
1940: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1950: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1960: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
1970: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
1980: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oken;.  }else if
1990: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
19a0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
19b0: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
19c0: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
19d0: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d  ight->span);.  }
19e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
19f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f  }../*.** When do
1a00: 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72  ing a nested par
1a10: 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c  se, you can incl
1a20: 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ude terms in an 
1a30: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68  expression.** th
1a40: 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69  at look like thi
1a50: 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e  s:   #0 #1 #2 ..
1a60: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72  .  These terms r
1a70: 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73  efer to elements
1a80: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
1a90: 2e 20 20 22 23 30 22 20 28 6f 72 20 6a 75 73 74  .  "#0" (or just
1aa0: 20 22 23 22 29 20 6d 65 61 6e 73 20 74 68 65 20   "#") means the 
1ab0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
1ac0: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
1ad0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
1ae0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
1af0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 23 2d 31 20   so forth.  #-1 
1b00: 6d 65 61 6e 73 0a 2a 2a 20 6d 65 6d 6f 72 79 20  means.** memory 
1b10: 6c 6f 63 61 74 69 6f 6e 20 30 2e 20 20 23 2d 32  location 0.  #-2
1b20: 20 6d 65 61 6e 73 20 6d 65 6d 6f 72 79 20 6c 6f   means memory lo
1b30: 63 61 74 69 6f 6e 20 31 2e 20 20 41 6e 64 20 73  cation 1.  And s
1b40: 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  o forth..**.** T
1b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1b60: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1b70: 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ser to deal with
1b80: 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72   on of those ter
1b90: 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69  ms..** It immedi
1ba0: 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20  ately generates 
1bb0: 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  code to store th
1bc0: 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d  e value in a mem
1bd0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ory location..**
1be0: 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20   The returns an 
1bf0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1c00: 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74  will code to ext
1c10: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 66  ract the value f
1c20: 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f  rom.** that memo
1c30: 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e  ry location as n
1c40: 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  eeded..*/.Expr *
1c50: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
1c60: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
1c70: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
1c80: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1c90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ca0: 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64  Expr *p;.  int d
1cb0: 65 70 74 68 3b 0a 20 20 69 66 28 20 76 3d 3d 30  epth;.  if( v==0
1cc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1cd0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
1ce0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
1cf0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d00: 73 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22  se, "near \"%T\"
1d10: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c  : syntax error",
1d20: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65   pToken);.    re
1d30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 20  turn 0;.  }.  p 
1d40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1d50: 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c  _REGISTER, 0, 0,
1d60: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
1d70: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
1d80: 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 0;  /* Malloc
1d90: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1da0: 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 26 70   depth = atoi(&p
1db0: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
1dc0: 69 66 28 20 64 65 70 74 68 3e 3d 30 20 29 7b 0a  if( depth>=0 ){.
1dd0: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
1de0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
1df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e00: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
1e10: 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 20 20 73  depth, 0);.    s
1e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1e30: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
1e40: 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  p->iTable, 1);. 
1e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69   }else{.    p->i
1e60: 54 61 62 6c 65 20 3d 20 2d 31 2d 64 65 70 74 68  Table = -1-depth
1e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
1e90: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
1ea0: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
1eb0: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
1ec0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
1ed0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
1ee0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
1ef0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
1f00: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
1f10: 45 78 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c  ExprAnd(Expr *pL
1f20: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1f30: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
1f40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f50: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
1f60: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
1f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
1f80: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
1f90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1fa0: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66  xpr(TK_AND, pLef
1fb0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
1fc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
1fd0: 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69  the Expr.span fi
1fe0: 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eld of the given
1ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
2000: 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20  pan all.** text 
2010: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
2020: 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  given tokens..*/
2030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2040: 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70  rSpan(Expr *pExp
2050: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  r, Token *pLeft,
2060: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b   Token *pRight){
2070: 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68  .  assert( pRigh
2080: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
2090: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
20a0: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c  if( !sqlite3_mal
20b0: 6c 6f 63 5f 66 61 69 6c 65 64 20 26 26 20 70 52  loc_failed && pR
20c0: 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74  ight->z && pLeft
20d0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ->z ){.    asser
20e0: 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  t( pLeft->dyn==0
20f0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65   || pLeft->z[pLe
2100: 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20  ft->n]==0 );.   
2110: 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d   if( pLeft->dyn=
2120: 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79  =0 && pRight->dy
2130: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  n==0 ){.      pE
2140: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c  xpr->span.z = pL
2150: 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45  eft->z;.      pE
2160: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52  xpr->span.n = pR
2170: 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  ight->n + Addr(p
2180: 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72  Right->z) - Addr
2190: 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20  (pLeft->z);.    
21a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
21b0: 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  pr->span.z = 0;.
21c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
21d0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
21e0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
21f0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
2200: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
2210: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
2220: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2230: 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c  prFunction(ExprL
2240: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
2250: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
2260: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
2270: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
2280: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
2290: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
22a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
22c0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
22d0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
22e0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
22f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2300: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2310: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
2320: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
2330: 73 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  st;.  if( pToken
2340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2350: 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29  pToken->dyn==0 )
2360: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
2370: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
2380: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2390: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d  token.z = 0;.  }
23a0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
23b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72  pNew->token;.  r
23c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
23d0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
23e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
23f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2400: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
2410: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
2420: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
2430: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
2440: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
2450: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
2460: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
2470: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
2480: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
2490: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
24a0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
24b0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
24c0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
24d0: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
24e0: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
24f0: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2500: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2510: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2520: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2530: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2540: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2550: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
2560: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
2570: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
2580: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
2590: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
25a0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
25b0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
25c0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
25d0: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
25e0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
25f0: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2600: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2610: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2620: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2630: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2640: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2650: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
2660: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
2670: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2680: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
2690: 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ken;.  if( pExpr
26a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
26b0: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
26c0: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
26d0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
26e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
26f0: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2700: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2710: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2720: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2730: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2740: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2750: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
2760: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2770: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
2780: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2790: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
27a0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
27b0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
27c0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
27d0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
27e0: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
27f0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2800: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2810: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2820: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2840: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 26 70  le = i = atoi(&p
2850: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
2860: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53    if( i<1 || i>S
2870: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
2880: 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20  LE_NUMBER ){.   
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
28b0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
28c0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
28d0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
28e0: 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41     SQLITE_MAX_VA
28f0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
2900: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2910: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
2920: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
2930: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
2940: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
2950: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
2960: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
2970: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
2980: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
2990: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
29a0: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
29b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
29c0: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
29d0: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
29e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
29f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
2a00: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
2a10: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
2a20: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
2a30: 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20  n = pToken->n;. 
2a40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
2a50: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
2a60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
2a70: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
2a80: 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  (pE = pParse->ap
2a90: 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20  VarExpr[i])!=0. 
2aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
2ab0: 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20  token.n==n.     
2ac0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
2ad0: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b  E->token.z, pTok
2ae0: 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  en->z, n)==0 ){.
2af0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2b00: 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62  Table = pE->iTab
2b10: 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  le;.        brea
2b20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2b30: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72  .    if( i>=pPar
2b40: 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a  se->nVarExpr ){.
2b50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
2b60: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
2b70: 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20  nVar;.      if( 
2b80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b90: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
2ba0: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
2bb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2bc0: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
2bd0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2be0: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
2bf0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c00: 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  xpr = sqliteReal
2c10: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 70 56 61  loc(pParse->apVa
2c20: 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  rExpr,.         
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2c40: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2c50: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
2c60: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
2c70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2c80: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d    if( !sqlite3_m
2c90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
2ca0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cb0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2cc0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
2cd0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2ce0: 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  r[pParse->nVarEx
2cf0: 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20  pr++] = pExpr;. 
2d00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d10: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72   .}../*.** Recur
2d20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d50: 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72  3ExprDelete(Expr
2d60: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73   p->span.dyn ) s
2d90: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
2da0: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
2db0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
2dc0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
2dd0: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
2de0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2df0: 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  lete(p->pLeft);.
2e00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2e10: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
2e20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2e30: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
2e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2e50: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
2e60: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
2e70: 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ee(p);.}.../*.**
2e80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2e90: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
2ea0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
2eb0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
2ec0: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
2ed0: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
2ee0: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
2ef0: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
2f00: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
2f10: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
2f20: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
2f30: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
2f40: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
2f50: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
2f60: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
2f70: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
2f80: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
2f90: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
2fa0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
2fb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
2fc0: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
2fd0: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
2fe0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
2ff0: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
3000: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
3010: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
3020: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
3030: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
3040: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
3050: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
3060: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
3070: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
3080: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f  t duplicated..*/
3090: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
30a0: 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a  prDup(Expr *p){.
30b0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
30c0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
30d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
30e0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
30f0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3100: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3110: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
3120: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
3130: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
3140: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
3150: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3160: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  z = sqliteStrNDu
3170: 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  p(p->token.z, p-
3180: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70  >token.n);.    p
3190: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
31a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
31b0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
31c0: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
31d0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
31e0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
31f0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
3200: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
3210: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
3220: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3230: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
3240: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
3250: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
3260: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
3270: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3280: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
3290: 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d  Select);.  pNew-
32a0: 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b  >pTab = p->pTab;
32b0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
32c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
32d0: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
32e0: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
32f0: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3300: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
3310: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
3320: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
3330: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
3340: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
3350: 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  >z = sqliteStrND
3360: 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  up(pFrom->z, pFr
3370: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
3380: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
3390: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
33a0: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
33b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
33c0: 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a  stDup(ExprList *
33d0: 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  p){.  ExprList *
33e0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
33f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
3400: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
3410: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
3420: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3430: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
3440: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
3450: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
3460: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3470: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
3480: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
3490: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
34a0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
34b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
34c0: 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nExpr*sizeof(p->
34d0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
34e0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
34f0: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
3500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3510: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
3520: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
3530: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
3540: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
3550: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
3560: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
3570: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
3580: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
3590: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
35a0: 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20  rDup(pOldExpr = 
35b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29  pOldItem->pExpr)
35c0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
35d0: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
35e0: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
35f0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
3600: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
3610: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
3620: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
3630: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
3640: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
3650: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
3660: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
3670: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
3680: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
3690: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
36a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
36b0: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
36c0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
36d0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
36e0: 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  (&pNewExpr->span
36f0: 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  , &pOldExpr->spa
3700: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  n);.    }.    as
3710: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d  sert( pNewExpr==
3720: 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73  0 || pNewExpr->s
3730: 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20  pan.z!=0 .      
3740: 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70        || pOldExp
3750: 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20  r->span.z==0 || 
3760: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
3770: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74  ailed );.    pIt
3780: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3790: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
37a0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
37b0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
37c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
37d0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
37e0: 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74  ->isAgg = pOldIt
37f0: 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70  em->isAgg;.    p
3800: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
3810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3820: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
3830: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
3840: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
3850: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
3860: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
3870: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
3880: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
3890: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
38a0: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
38b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
38c0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
38d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
38e0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
38f0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
3900: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
3910: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
3920: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
3930: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
3940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3950: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
3960: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
3970: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
3980: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
3990: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
39a0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
39b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
39c0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
39d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
39e0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
39f0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
3a00: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
3a10: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
3a20: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
3a30: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3a40: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
3a50: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3a60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
3a70: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3a80: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
3a90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
3aa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3ab0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ac0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
3ad0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
3b00: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
3b10: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
3b20: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3b30: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
3b40: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3b50: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
3b60: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3b70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
3b80: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
3b90: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
3ba0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
3bb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
3bc0: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
3bd0: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
3be0: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
3bf0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
3c00: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
3c10: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
3c20: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
3c30: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  if( pNewItem->pT
3c40: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ab ){.      pNew
3c50: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72  Item->pTab->isTr
3c60: 61 6e 73 69 65 6e 74 20 3d 20 30 3b 0a 20 20 20  ansient = 0;.   
3c70: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
3c80: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3c90: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64  e3SelectDup(pOld
3ca0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
3cb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
3cc0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
3cd0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  up(pOldItem->pOn
3ce0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3cf0: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
3d00: 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49  3IdListDup(pOldI
3d10: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
3d20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
3d30: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
3d40: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
3d50: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
3d60: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
3d70: 69 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70  istDup(IdList *p
3d80: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
3d90: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
3da0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3db0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
3dc0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
3dd0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
3de0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3df0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3e00: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
3e10: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
3e20: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d  New->a = sqliteM
3e30: 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64  allocRaw( p->nId
3e40: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
3e50: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
3e60: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
3e70: 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  teFree(pNew);.  
3e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3ea0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
3eb0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3ec0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
3ed0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
3ee0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3ef0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
3f00: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
3f10: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
3f20: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3f30: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3f40: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
3f50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
3f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3f70: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
3f80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65  ite3SelectDup(Se
3f90: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
3fa0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
3fb0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3fc0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3fd0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3fe0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3ff0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4000: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
4010: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
4020: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
4030: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
4040: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45  xprListDup(p->pE
4050: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
4060: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
4070: 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29  ListDup(p->pSrc)
4080: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
4090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
40a0: 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  p(p->pWhere);.  
40b0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
40c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
40d0: 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  Dup(p->pGroupBy)
40e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
40f0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
4100: 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  up(p->pHaving);.
4110: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
4120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4130: 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42  stDup(p->pOrderB
4140: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  y);.  pNew->op =
4150: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
4160: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
4170: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72  SelectDup(p->pPr
4180: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ior);.  pNew->pL
4190: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
41a0: 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29  prDup(p->pLimit)
41b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
41c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
41d0: 75 70 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  up(p->pOffset);.
41e0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
41f0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66   -1;.  pNew->iOf
4200: 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  fset = -1;.  pNe
4210: 77 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  w->ppOpenTemp = 
4220: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73  0;.  pNew->isRes
4230: 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73  olved = p->isRes
4240: 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69  olved;.  pNew->i
4250: 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
4260: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4270: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
4280: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4290: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61  (Select *p){.  a
42a0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
42b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
42c0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
42d0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
42e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
42f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
4300: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
4310: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4320: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4330: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4340: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4350: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4360: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4370: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4380: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4390: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
43a0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
43b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
43c0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
43d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
43e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
43f0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
4400: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
4410: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
4420: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
4430: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
4440: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
4450: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4460: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
4470: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
4480: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
4490: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
44a0: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
44b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
44c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
44d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
44e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
44f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
4500: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
4510: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4520: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
4530: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
4540: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
4550: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4560: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
4570: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
4580: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
4590: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
45a0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
45b0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
45c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
45d0: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  (pName);.    pIt
45e0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
45f0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
4600: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
4610: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
4620: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
4630: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
4640: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
4650: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
4660: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
4670: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
4680: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
4690: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
46a0: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
46b0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
46c0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
46d0: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
46e0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
46f0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
4700: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
4710: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
4720: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4730: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
4740: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
4750: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
4760: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
4770: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
4780: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
4790: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
47a0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
47b0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
47c0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
47d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
47e0: 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45  Delete(pItem->pE
47f0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
4800: 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
4810: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
4820: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
4830: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4840: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  st);.}../*.** Wa
4850: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
4860: 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75   tree.  Call xFu
4870: 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  nc for each node
4880: 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   visited..**.** 
4890: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
48a0: 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65   from xFunc dete
48b0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
48c0: 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e  he tree walk con
48d0: 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61  tinues..** 0 mea
48e0: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b  ns continue walk
48f0: 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20 31  ing the tree.  1
4900: 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61   means do not wa
4910: 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f  lk children.** o
4920: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
4930: 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  de but continue 
4940: 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20  with siblings.  
4950: 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a  2 means abandon.
4960: 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  ** the tree walk
4970: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a   completely..**.
4980: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4990: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
49a0: 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62  utine is 1 to ab
49b0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
49c0: 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20  alk.** and 0 to 
49d0: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73 74 61  continue..*/.sta
49e0: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
49f0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c  List(ExprList *,
4a00: 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c   int (*)(void *,
4a10: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29   Expr*), void *)
4a20: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  ;.static int wal
4a30: 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a  kExprTree(Expr *
4a40: 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75  pExpr, int (*xFu
4a50: 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29  nc)(void*,Expr*)
4a60: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4a70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
4a80: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4a90: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
4aa0: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
4ab0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
4ac0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4ad0: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
4ae0: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
4af0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4b00: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4b10: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
4b20: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4b30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
4b40: 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  ( walkExprList(p
4b50: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75  Expr->pList, xFu
4b60: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4b70: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4b80: 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn rc>1;.}../*.*
4b90: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
4ba0: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
4bb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69  expression in li
4bc0: 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st p..*/.static 
4bd0: 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  int walkExprList
4be0: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
4bf0: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20  t (*xFunc)(void 
4c00: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
4c10: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *pArg){.  int i;
4c20: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
4c30: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
4c40: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
4c50: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  n 0;.  for(i=p->
4c60: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
4c70: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
4c80: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77  em++){.    if( w
4c90: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
4ca0: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
4cb0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4cc0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4cd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
4ce0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4cf0: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4d00: 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70  sion in Select p
4d10: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
4d20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
4d30: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
4d40: 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61  sub-selects in a
4d50: 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ny FROM clause o
4d60: 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f  r the LIMIT.** o
4d70: 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  r OFFSET express
4d80: 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ions...*/.static
4d90: 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45   int walkSelectE
4da0: 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  xpr(Select *p, i
4db0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4dc0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4dd0: 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45   *pArg){.  walkE
4de0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
4df0: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  t, xFunc, pArg);
4e00: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
4e10: 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63  p->pWhere, xFunc
4e20: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
4e30: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
4e40: 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  pBy, xFunc, pArg
4e50: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
4e60: 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46  e(p->pHaving, xF
4e70: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
4e80: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  lkExprList(p->pO
4e90: 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70  rderBy, xFunc, p
4ea0: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
4eb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
4ec0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
4ed0: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
4ee0: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
4ef0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
4f00: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
4f10: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
4f20: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
4f30: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
4f40: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
4f50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
4f60: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
4f70: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
4f80: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
4f90: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
4fa0: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
4fb0: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
4fc0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
4fd0: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
4fe0: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
4ff0: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
5000: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
5010: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
5020: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
5030: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
5040: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
5050: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
5060: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
5070: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
5080: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
5090: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
50a0: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
50b0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
50c0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
50d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
50e0: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
50f0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5110: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
5120: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
5130: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5140: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
5150: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
5160: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
5170: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
5180: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
5190: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
51a0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  N:.    case TK_F
51b0: 55 4e 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66  UNCTION:.#ifndef
51c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
51d0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
51e0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
51f0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
5200: 6e 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e  ndif.      *((in
5210: 74 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20  t*)pArg) = 0;.  
5220: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
5230: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5240: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
5250: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
5260: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5270: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
5280: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5290: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
52a0: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
52b0: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
52c0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
52d0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
52e0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
52f0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
5300: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
5310: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
5320: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
5330: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5340: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5350: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5360: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5370: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5380: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5390: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
53a0: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
53b0: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
53c0: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
53d0: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
53e0: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
53f0: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
5400: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
5410: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
5420: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
5430: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
5440: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
5450: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
5460: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
5470: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
5480: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5490: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
54a0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
54b0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
54c0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
54d0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
54e0: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
54f0: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
5500: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5510: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
5520: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
5530: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
5540: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5550: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
5560: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5570: 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65  GetInt32(p->toke
5580: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
5590: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
55a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
55b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
55c0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
55d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
55e0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
55f0: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
5600: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
5610: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
5620: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
5630: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5640: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
5650: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
5660: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
5670: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
5680: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
56a0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
56b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
56c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
56d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
56e0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
56f0: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
5700: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
5710: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
5720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
5730: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5740: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
5750: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5770: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
5780: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
57a0: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
57b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
57c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
57d0: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
57e0: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
57f0: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
5800: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
5810: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
5820: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
5830: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
5840: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
5850: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
5860: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
5870: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
5880: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
5890: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
58a0: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
58b0: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
58c0: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
58d0: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
58e0: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
58f0: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
5900: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
5910: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
5940: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5950: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
5960: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
5970: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
5980: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
59b0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
59c0: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
59d0: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
59e0: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
59f0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
5a00: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
5a10: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
5a20: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
5a30: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
5a40: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
5a50: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
5a60: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
5a70: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
5a80: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
5a90: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
5aa0: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
5ab0: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
5ac0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
5ad0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
5ae0: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
5af0: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
5b00: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
5b10: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
5b20: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
5b30: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
5b40: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
5b50: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
5b60: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
5b70: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5b80: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
5b90: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
5ba0: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
5bb0: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
5bc0: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
5bd0: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
5be0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
5bf0: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
5c00: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
5c10: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
5c20: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
5c30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
5c40: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
5c50: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
5c60: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
5c70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
5c80: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
5c90: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
5ca0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
5cb0: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
5cc0: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
5cd0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5ce0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
5cf0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
5d00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54  */.  Token *pDbT
5d10: 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  oken,     /* Nam
5d20: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
5d30: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
5d40: 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  le, or NULL */. 
5d50: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f   Token *pTableTo
5d60: 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ken,  /* Name of
5d70: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
5d80: 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c  g column, or NUL
5d90: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  L */.  Token *pC
5da0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e  olumnToken, /* N
5db0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
5dc0: 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  n. */.  NameCont
5dd0: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20  ext *pNC,    /* 
5de0: 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  The name context
5df0: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
5e00: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45   the name */.  E
5e10: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5e20: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73      /* Make this
5e30: 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74   EXPR node point
5e40: 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64   to the selected
5e50: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20   column */.){.  
5e60: 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20  char *zDb = 0;  
5e70: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5e80: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
5e90: 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20  he "X" in X.Y.Z 
5ea0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20  */.  char *zTab 
5eb0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
5ec0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  e of the table. 
5ed0: 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e   The "Y" in X.Y.
5ee0: 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68  Z or Y.Z */.  ch
5ef0: 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20  ar *zCol = 0;   
5f00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
5f10: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22  e column.  The "
5f20: 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  Z" */.  int i, j
5f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5f40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
5f50: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20  .  int cnt = 0; 
5f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5f70: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
5f80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
5f90: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
5fa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5fb0: 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  f matching table
5fc0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69   names */.  sqli
5fd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5fe0: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
5ff0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75  tabase */.  stru
6000: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
6010: 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a  *pItem;       /*
6020: 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67   Use for looping
6030: 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69   over pSrcList i
6040: 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  tems */.  struct
6050: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
6060: 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54  Match = 0;  /* T
6070: 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63  he matching pSrc
6080: 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e  List item */.  N
6090: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70  ameContext *pTop
60a0: 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20  NC = pNC;       
60b0: 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f   /* First nameco
60c0: 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73  ntext in the lis
60d0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
60e0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20  pColumnToken && 
60f0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20  pColumnToken->z 
6100: 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58  ); /* The Z in X
6110: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
6120: 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73  ULL */.  zDb = s
6130: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6140: 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20  ken(pDbToken);. 
6150: 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e   zTab = sqlite3N
6160: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
6170: 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f  bleToken);.  zCo
6180: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
6190: 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e  romToken(pColumn
61a0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71  Token);.  if( sq
61b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
61c0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
61d0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
61e0: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
61f0: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
6200: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
6210: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
6220: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
6230: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
6240: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6250: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a   = pNC->pEList;.
6260: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
6270: 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73  zTab==0 || pELis
6280: 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69  t==0 ); */.    i
6290: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
62a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
62b0: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
62c0: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
62d0: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
62e0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
62f0: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
6300: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Tab;.        Col
6310: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
6320: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6330: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6350: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
6360: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
6370: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6380: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
6390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
63a0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
63b0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
63c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
63d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
63e0: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
63f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6400: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6410: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6420: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
6430: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
6440: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
6450: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
6460: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
6470: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
6480: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
6490: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
64a0: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
64b0: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
64c0: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
64d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
64e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
64f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6500: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
6510: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74       if( 0==(cnt
6520: 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  Tab++) ){.      
6530: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6540: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
6550: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  or;.          pE
6560: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
6570: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20  >iDb;.          
6580: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
6590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65a0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
65b0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
65c0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
65d0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
65e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
65f0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
6600: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6610: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
6620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6630: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
6640: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
6650: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
6660: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
6670: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
6680: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
6690: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73           /* Subs
66a0: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
66b0: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
66c0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
66d0: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
66e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
66f0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
6700: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
6710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6720: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
6730: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
6740: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
6750: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
6760: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
6770: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .pColl;.        
6780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
67a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
67b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
67c0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
67d0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
67e0: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
67f0: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
6800: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
6810: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
6820: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
6830: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
6840: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
6850: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
6860: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
6870: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6880: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
6890: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
68a0: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
68b0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
68c0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
68d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
68e0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
68f0: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
6900: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
6910: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
6930: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
6940: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
6950: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6960: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6970: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
6980: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
6990: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
69a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
69b0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
69c0: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
69d0: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
69e0: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
69f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
6a00: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
6a10: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
6a20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
6a30: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
6a40: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
6a50: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
6a60: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
6a70: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
6a80: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
6a90: 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  j;.        Colum
6aa0: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
6ab0: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
6ac0: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
6ad0: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63  ->iDb;.        c
6ae0: 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  ntTab++;.       
6af0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54   for(j=0; j < pT
6b00: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
6b10: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
6b20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6b30: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
6b40: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
6b50: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
6b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6b70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
6b80: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
6b90: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
6ba0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
6bb0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
6bc0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
6bd0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6be0: 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  >pColl = pTab->a
6bf0: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
6c00: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6c10: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
6c20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6c30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6c50: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
6c60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6c70: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
6c80: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
6c90: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
6ca0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
6cb0: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
6cc0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
6cd0: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
6ce0: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
6cf0: 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zCol) ){.      
6d00: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
6d10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
6d20: 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  -1;.      pExpr-
6d30: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
6d40: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
6d50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
6d60: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
6d70: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
6d80: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
6d90: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
6da0: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
6db0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
6dc0: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
6dd0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
6de0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
6df0: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
6e00: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
6e10: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
6e20: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
6e30: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
6e40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
6e50: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
6e60: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
6e70: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
6e80: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
6e90: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
6ea0: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
6eb0: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
6ec0: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
6ed0: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
6ee0: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
6ef0: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
6f00: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
6f10: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
6f20: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
6f30: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
6f40: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
6f50: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
6f60: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
6f70: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
6f80: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
6f90: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
6fa0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
6fb0: 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21  nt==0 && pEList!
6fc0: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
6fd0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
6fe0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
6ff0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
7000: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
7010: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
7020: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
7030: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
7040: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
7050: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
7060: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
7070: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
7080: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
7090: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
70a0: 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20  p = TK_AS;.     
70b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
70c0: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
70d0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
70e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
70f0: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  (pEList->a[j].pE
7100: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
7110: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cnt = 1;.       
7120: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
7130: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
7140: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
7150: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b  ookupname_end_2;
7160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7170: 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   } .    }..    /
7180: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
7190: 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65   next name conte
71a0: 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69  xt.  The loop wi
71b0: 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74  ll exit when eit
71c0: 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61  her.    ** we ha
71d0: 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e  ve a match (cnt>
71e0: 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75  0) or when we ru
71f0: 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f  n out of name co
7200: 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ntexts..    */. 
7210: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
7220: 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43  .      pNC = pNC
7230: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
7240: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
7250: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
7260: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
7270: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
7280: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
7290: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
72a0: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
72b0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
72c0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
72d0: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
72e0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
72f0: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
7300: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
7310: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
7320: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
7330: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
7340: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
7350: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
7360: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
7370: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
7380: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
7390: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
73a0: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
73b0: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
73c0: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
73d0: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
73e0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
73f0: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
7400: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
7410: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
7420: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
7430: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
7440: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
7450: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
7460: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
7470: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
7480: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
7490: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
74a0: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
74b0: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
74c0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
74d0: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61  nt!=1 ){.    cha
74e0: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68  r *z = 0;.    ch
74f0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
7500: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
7510: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
7520: 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  s" : "ambiguous 
7530: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
7540: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b  ;.    if( zDb ){
7550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7560: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c  tString(&z, zDb,
7570: 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c   ".", zTab, ".",
7580: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   zCol, 0);.    }
7590: 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b  else if( zTab ){
75a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
75b0: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62  tString(&z, zTab
75c0: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
75d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
75e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44    z = sqliteStrD
75f0: 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  up(zCol);.    }.
7600: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7610: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
7620: 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
7630: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f  Free(z);.    pTo
7640: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  pNC->nErr++;.  }
7650: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
7660: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
7670: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
7680: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
7690: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
76a0: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
76b0: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
76c0: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
76d0: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
76e0: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
76f0: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
7700: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
7710: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
7720: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
7730: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
7740: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7750: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
7760: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
7770: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
7780: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
7790: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
77a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
77b0: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
77c0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
77d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
77e0: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
77f0: 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  Bitmask)*8 ){.  
7800: 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42      n = sizeof(B
7810: 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20  itmask)*8-1;.   
7820: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
7830: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
7840: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
7850: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
7860: 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20  Used |= 1<<n;.  
7870: 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  }..lookupname_en
7880: 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  d:.  /* Clean up
7890: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
78a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
78b0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
78c0: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
78d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
78e0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
78f0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
7900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7910: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
7920: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
7930: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
7940: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
7950: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f  .lookupname_end_
7960: 32 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  2:.  sqliteFree(
7970: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74  zCol);.  if( cnt
7980: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
7990: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
79a0: 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64   sqlite3AuthRead
79b0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
79c0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a  pNC->pSrcList);.
79d0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 26      if( pMatch &
79e0: 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65  & !pMatch->pSele
79f0: 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  ct ){.      pExp
7a00: 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63 68  r->pTab = pMatch
7a10: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  ->pTab;.    }.  
7a20: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
7a30: 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e  he nRef value on
7a40: 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78   all name contex
7a50: 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70  ts from TopNC up
7a60: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   to.    ** the p
7a70: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e  oint where the n
7a80: 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a  ame matched. */.
7a90: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
7aa0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e     assert( pTopN
7ab0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  C!=0 );.      pT
7ac0: 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  opNC->nRef++;.  
7ad0: 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d      if( pTopNC==
7ae0: 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pNC ) break;.   
7af0: 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70     pTopNC = pTop
7b00: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
7b10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7b20: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
7b30: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
7b40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7b50: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
7b60: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
7b70: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
7b80: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62  .** Resolve symb
7b90: 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20  olic names into 
7ba0: 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74  TK_COLUMN operat
7bb0: 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ors for the curr
7bc0: 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74  ent.** node in t
7bd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
7be0: 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f  ee.  Return 0 to
7bf0: 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65   continue the se
7c00: 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65  arch down.** the
7c10: 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62   tree or 2 to ab
7c20: 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c  ort the tree wal
7c30: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
7c40: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
7c50: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61  error checking a
7c60: 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  nd name resoluti
7c70: 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69  on for.** functi
7c80: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f  on names.  The o
7c90: 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72  perator for aggr
7ca0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
7cb0: 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f  is changed.** to
7cc0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
7cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7ce0: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
7cf0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
7d00: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
7d10: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
7d20: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41  (NameContext*)pA
7d30: 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rg;.  SrcList *p
7d40: 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73 65  SrcList;.  Parse
7d50: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
7d60: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7d70: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
7d80: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72 63  pNC!=0 );.  pSrc
7d90: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
7da0: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20 3d  List;.  pParse =
7db0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pNC->pParse;.. 
7dc0: 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
7dd0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7de0: 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65  P_Resolved) ) re
7df0: 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53 65  turn 1;.  ExprSe
7e00: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
7e10: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
7e20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
7e30: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
7e40: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
7e50: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
7e60: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
7e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7e80: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
7e90: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
7ea0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
7eb0: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
7ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7ed0: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
7ee0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
7ef0: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
7f00: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
7f10: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
7f20: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
7f30: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
7f40: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
7f50: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
7f60: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
7f70: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
7f80: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
7f90: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
7fa0: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
7fb0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
7fc0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
7fd0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
7fe0: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
7ff0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8000: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
8010: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
8020: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
8030: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
8040: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
8050: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
8060: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
8070: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
8080: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
8090: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
80a0: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
80b0: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
80c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
80d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
80e0: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
80f0: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
8100: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
8110: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
8120: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
8130: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
8140: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8150: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
8160: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
8170: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
8180: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
8190: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
81a0: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
81b0: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
81c0: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
81d0: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
81e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
81f0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8200: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
8210: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
8220: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8230: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8240: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8250: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
8260: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8280: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
8290: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
82a0: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
82b0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
82c0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
82d0: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
82e0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
82f0: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
8300: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
8310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8320: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
8330: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
8340: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
8350: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
8360: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
8370: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
8380: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
8390: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
83a0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
83b0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
83c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
83d0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
83e0: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
83f0: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
8400: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
8410: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
8420: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
8430: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8440: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8450: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
8460: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
8470: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
8480: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
8490: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
84a0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
84b0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
84c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
84d0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
84e0: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
84f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8500: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
8510: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
8520: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
8530: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
8560: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
8570: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
8580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
8590: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
85a0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
85b0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
85c0: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
85d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
85e0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
85f0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
8600: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50      int enc = pP
8610: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 20 20  arse->db->enc;  
8620: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
8630: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
8640: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
8650: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
8660: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
8670: 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
8680: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8690: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
86a0: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65  , zId, nId, n, e
86b0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
86c0: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
86d0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
86e0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
86f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
8700: 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30   nId, -1, enc, 0
8710: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8720: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
8730: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
8740: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
8760: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8770: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8790: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
87a0: 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20  >xFunc==0;.     
87b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
87c0: 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c  agg && !pNC->all
87d0: 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  owAgg ){.       
87e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
87f0: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
8800: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
8810: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20  nction %.*s()", 
8820: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20  nId,zId);.      
8830: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
8840: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
8850: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
8860: 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  f( no_such_func 
8870: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8880: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8890: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
88a0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
88b0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
88c0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
88d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
88e0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
88f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8900: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
8910: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
8920: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
8930: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
8940: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
8950: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
8960: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
8970: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
8980: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
8990: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
89a0: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
89b0: 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20      pNC->hasAgg 
89c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
89d0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
89e0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
89f0: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
8a00: 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26  ; pNC->nErr==0 &
8a10: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
8a20: 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65       walkExprTre
8a30: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
8a40: 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65  xpr, nameResolve
8a50: 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20  rStep, pNC);.   
8a60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8a70: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
8a80: 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  owAgg = 1;.     
8a90: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
8aa0: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
8ab0: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
8ac0: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
8ad0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
8ae0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
8af0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8b00: 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20  return is_agg;. 
8b10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
8b20: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8b30: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
8b40: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
8b50: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
8b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
8b70: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
8b80: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
8b90: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
8ba0: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20  = pNC->nRef;.   
8bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
8bc0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
8bd0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
8be0: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
8bf0: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
8c00: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
8c10: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
8c20: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
8c30: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
8c40: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
8c50: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
8c60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8c70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
8c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8c90: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
8ca0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8cb0: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
8cc0: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
8cd0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
8ce0: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
8cf0: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
8d00: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
8d10: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
8d20: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
8d30: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
8d40: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
8d50: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
8d60: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
8d70: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
8d80: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
8d90: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
8da0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
8db0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
8dc0: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
8dd0: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
8de0: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
8df0: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
8e00: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
8e10: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
8e20: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
8e30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
8e40: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
8e50: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
8e60: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
8e70: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
8e80: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
8e90: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
8ea0: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
8eb0: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
8ec0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
8ed0: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
8ee0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
8ef0: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
8f00: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
8f10: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
8f20: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
8f30: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
8f40: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
8f50: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f  .**.** Also reso
8f60: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8f70: 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65  es and check the
8f80: 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70   functions for p
8f90: 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20  roper.** usage. 
8fa0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66   Make sure all f
8fb0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72  unction names ar
8fc0: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  e recognized and
8fd0: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a   all functions.*
8fe0: 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65  * have the corre
8ff0: 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
9000: 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61  uments.  Leave a
9010: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
9020: 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ** in pParse->zE
9030: 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e  rrMsg if anythin
9040: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74  g is amiss.  Ret
9050: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
9060: 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
9070: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9080: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
9090: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  gate functions t
90a0: 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41  hen set the EP_A
90b0: 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f  gg.** property o
90c0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
90d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
90e0: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
90f0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
9100: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
9110: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
9120: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
9130: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  in. */.  Expr *p
9140: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
9150: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
9160: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
9170: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  d. */.){.  if( p
9180: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
9190: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
91a0: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
91b0: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
91c0: 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  ;.  if( pNC->nEr
91d0: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
91e0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
91f0: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
9200: 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61  .  return ExprHa
9210: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9220: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f   EP_Error);.}../
9230: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69  *.** A pointer i
9240: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
9250: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
9260: 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d  d to pass inform
9270: 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68  ation.** through
9280: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e   walkExprTree in
9290: 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53  to codeSubqueryS
92a0: 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65  tep()..*/.typede
92b0: 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f  f struct QueryCo
92c0: 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a  der QueryCoder;.
92d0: 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65  struct QueryCode
92e0: 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  r {.  Parse *pPa
92f0: 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  rse;       /* Th
9300: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
9310: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
9320: 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e  xt *pNC;    /* N
9330: 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73  amespace of firs
9340: 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72  t enclosing quer
9350: 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  y */.};.../*.** 
9360: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
9370: 72 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  r subqueries and
9380: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a   IN operators..*
9390: 2a 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  *.** IN operator
93a0: 73 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 20 66  s comes in two f
93b0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  orms:.**.**     
93c0: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65        expr IN (e
93d0: 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a  xprlist).** and.
93e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
93f0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
9400: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ).**.** The firs
9410: 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65  t form is handle
9420: 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  d by creating a 
9430: 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  set holding the 
9440: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77  list.** of allow
9450: 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  ed values.  The 
9460: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73  second form caus
9470: 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f  es the SELECT to
9480: 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20   generate .** a 
9490: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
94a0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
94b0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
94c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
94d0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
94e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
94f0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6c 61  pExpr){.  int la
9500: 62 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  bel = 0;        
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 2f 2a 20 41 64 64 72 65 73 73 20 61 66 74 65   /* Address afte
9530: 72 20 73 75 62 2d 73 65 6c 65 63 74 20 63 6f 64  r sub-select cod
9540: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
9550: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
9560: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
9570: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
9580: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
9590: 6f 74 20 61 20 76 61 72 69 61 62 6c 65 20 28 63  ot a variable (c
95a0: 6f 72 72 65 6c 61 74 65 64 29 20 73 65 6c 65 63  orrelated) selec
95b0: 74 2c 20 74 68 65 6e 20 65 78 65 63 75 74 65 0a  t, then execute.
95c0: 20 20 2a 2a 20 69 74 20 6f 6e 6c 79 20 6f 6e 63    ** it only onc
95d0: 65 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 20 69  e. Unless this i
95e0: 73 20 70 61 72 74 20 6f 66 20 61 20 74 72 69 67  s part of a trig
95f0: 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 6e 0a  ger program. In.
9600: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 72    ** that case r
9610: 65 2d 65 78 65 63 75 74 65 20 65 76 65 72 79 20  e-execute every 
9620: 74 69 6d 65 20 28 74 68 69 73 20 63 6f 75 6c 64  time (this could
9630: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 29 2e 0a   be optimized)..
9640: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
9650: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
9660: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
9670: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
9680: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
9690: 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73   int mem = pPars
96a0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
96b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
96c0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
96d0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 6c 61 62 65  em, 0);.    labe
96e0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
96f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
9700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9710: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c  p(v, OP_If, 0, l
9720: 61 62 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  abel);.    sqlit
9730: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9740: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
9750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9760: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
9770: 53 74 6f 72 65 2c 20 6d 65 6d 2c 20 31 29 3b 0a  Store, mem, 1);.
9780: 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
9790: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
97a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
97b0: 70 28 76 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65  p(v, OP_AggConte
97c0: 78 74 50 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20  xtPush, 0, 0);. 
97d0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
97e0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
97f0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
9800: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
9810: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
9820: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
9830: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
9840: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
9850: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
9860: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
9870: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9880: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9890: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
98a0: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
98b0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
98c0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
98d0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
98e0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
98f0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
9900: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
9910: 20 77 61 79 2e 20 41 20 74 65 6d 70 6f 72 61 72   way. A temporar
9920: 79 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  y table is .    
9930: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
9940: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
9950: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
9960: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
9970: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
9980: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
9990: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
99a0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
99b0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
99c0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
99d0: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
99e0: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
99f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
9a00: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
9a10: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
9a20: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
9a30: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
9a40: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
9a50: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
9a60: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
9a70: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
9a80: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
9a90: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
9aa0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
9ab0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
9ac0: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
9ad0: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
9ae0: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
9af0: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
9b00: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
9b10: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
9b20: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
9b30: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
9b40: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
9b50: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
9b60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
9b70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
9b80: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
9b90: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
9ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9bb0: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78  OP_OpenTemp, pEx
9bc0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
9bd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65        memset(&ke
9be0: 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  yInfo, 0, sizeof
9bf0: 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20  (keyInfo));.    
9c00: 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64    keyInfo.nField
9c10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
9c20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9c30: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
9c40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
9c50: 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
9c60: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
9c70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
9c80: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
9c90: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
9ca0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
9cb0: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
9cc0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
9cd0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
9ce0: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
9cf0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
9d00: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
9d10: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
9d20: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
9d30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72          int iPar
9d40: 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  m = pExpr->iTabl
9d50: 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69  e +  (((int)affi
9d60: 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20  nity)<<16);.    
9d70: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
9d80: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
9d90: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
9da0: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
9db0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9dd0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
9de0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
9df0: 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c   SRT_Set, iParm,
9e00: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
9e10: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
9e20: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
9e30: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
9e40: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
9e50: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20  ist->nExpr>0 ){ 
9e60: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
9e70: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69  fo.aColl[0] = bi
9e80: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
9e90: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
9ea0: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
9eb0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
9ec0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
9ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9ee0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
9ef0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
9f00: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
9f10: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
9f20: 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46          **..** F
9f30: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9f40: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
9f50: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
9f60: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
9f70: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
9f80: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
9f90: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
9fa0: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
9fb0: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
9fc0: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
9fd0: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
9fe0: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
9ff0: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
a000: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
a010: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
a020: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
a030: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a040: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a050: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
a060: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
a070: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
a080: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
a090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a0a0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
a0b0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
a0c0: 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  >pColl;..       
a0d0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
a0e0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
a0f0: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
a100: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
a110: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
a120: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
a130: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
a140: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
a150: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
a160: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ..          /* C
a170: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 78  heck that the ex
a180: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a190: 74 61 6e 74 20 61 6e 64 20 76 61 6c 69 64 2e 20  tant and valid. 
a1a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
a1b0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a1c0: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a1e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a1f0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
a200: 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73 69    "right-hand si
a210: 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  de of IN operato
a220: 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  r must be consta
a230: 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt");.          
a240: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
a250: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
a260: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
a270: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
a280: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
a290: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a2b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a2c0: 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20  e, pE2);.       
a2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a2e0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
a2f0: 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e  rd, 1, 0, &affin
a300: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
a310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a320: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
a330: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
a340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a350: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
a360: 72 4b 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  rKey, pExpr->iTa
a370: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
a380: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a390: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a3a0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76  geP3(v, addr, (v
a3b0: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
a3c0: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
a3d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a3e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
a3f0: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
a400: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
a410: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
a420: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
a430: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
a440: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
a450: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
a460: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
a470: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
a480: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
a490: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
a4a0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
a4b0: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
a4c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 6f   */.      int so
a4d0: 70 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  p;.      Select 
a4e0: 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20 20 70 45  *pSel;..      pE
a4f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
a500: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a510: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
a520: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
a530: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
a540: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
a550: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
a560: 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Mem;.      }else
a570: 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  {.        static
a580: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
a590: 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20 31 20 7d   = { "1", 0, 1 }
a5a0: 3b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  ;.        sop = 
a5b0: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
a5c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
a5d0: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
a5e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
a5f0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
a600: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a610: 70 70 65 6e 64 28 30 2c 20 0a 20 20 20 20 20 20  ppend(0, .      
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
a640: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
a650: 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a 20 20 20  , &one), 0);.   
a660: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a670: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
a680: 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70 45 78 70   pSel, sop, pExp
a690: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  r->iColumn, 0, 0
a6a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
a6b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a6c0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
a6d0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
a6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a6f0: 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50 6f   OP_AggContextPo
a700: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  p, 0, 0);.  }.  
a710: 69 66 28 20 6c 61 62 65 6c 3c 30 20 29 7b 0a 20  if( label<0 ){. 
a720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a730: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
a740: 62 65 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bel);.  }.  retu
a750: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
a760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a770: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
a780: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
a790: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
a7a0: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
a7b0: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
a7c0: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f  text z[0..n-1] o
a7d0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
a7e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
a7f0: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
a800: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
a810: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
a820: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65  .  if( sqlite3Ge
a830: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a850: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a860: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65  ger, i, 0);.  }e
a870: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
a880: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29  itsIn64Bits(z) )
a890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a8a0: 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67  eOp3(v, OP_Integ
a8b0: 65 72 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  er, 0, 0, z, n);
a8c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
a8d0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a8e0: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
a8f0: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , n);.  }.}../*.
a900: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a910: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
a920: 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
a930: 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
a940: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c  expression and l
a950: 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20  eave the result 
a960: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74  on the top of st
a970: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
a980: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
a990: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
a9a0: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
a9b0: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
a9c0: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
a9d0: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
a9e0: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
a9f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
aa00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
aa10: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
aa20: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
aa30: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
aa40: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
aa50: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
aa60: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
aa70: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
aa80: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
aa90: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
aaa0: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
aab0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
aac0: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
aad0: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
aae0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
aaf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
ab00: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
ab10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ab20: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  pVdbe;.  int op;
ab30: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
ab40: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
ab50: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
ab60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ab70: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
ab80: 29 3b 20 20 2f 2a 20 45 6d 70 74 79 20 65 78 70  );  /* Empty exp
ab90: 72 65 73 73 69 6f 6e 20 65 76 61 6c 73 20 74 6f  ression evals to
aba0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 72 65 74   NULL */.    ret
abb0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  urn;.  }.  op = 
abc0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
abd0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
abe0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
abf0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
ac00: 73 65 2d 3e 66 69 6c 6c 41 67 67 20 26 26 20 70  se->fillAgg && p
ac10: 45 78 70 72 2d 3e 69 41 67 67 3e 3d 30 20 29 7b  Expr->iAgg>=0 ){
ac20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ac40: 41 67 67 47 65 74 2c 20 70 45 78 70 72 2d 3e 69  AggGet, pExpr->i
ac50: 41 67 67 43 74 78 2c 20 70 45 78 70 72 2d 3e 69  AggCtx, pExpr->i
ac60: 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Agg);.      }els
ac70: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f  e if( pExpr->iCo
ac80: 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
ac90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aca0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
acb0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
acc0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
acd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ace0: 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
acf0: 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70  , pExpr->pTab, p
ad00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
ad10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ad20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
ad40: 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  o, pExpr->iTable
ad50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ad60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
ad80: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
ad90: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78  deInteger(v, pEx
ada0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
adb0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
adc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
add0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
ade0: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
adf0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
ae00: 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54  assert( TK_FLOAT
ae10: 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20  ==OP_Real );.   
ae20: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54     assert( TK_ST
ae30: 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38  RING==OP_String8
ae40: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ae50: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
ae60: 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  0, 0, pExpr->tok
ae70: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
ae80: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  en.n);.      sql
ae90: 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50  ite3VdbeDequoteP
aea0: 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  3(v, -1);.      
aeb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
aec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aed0: 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
aee0: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
aef0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
af00: 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42  TK_BLOB==OP_HexB
af10: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lob );.      sql
af20: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
af30: 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e  p, 0, 0, pExpr->
af40: 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45 78 70 72  token.z+1, pExpr
af50: 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b 0a 20 20  ->token.n-1);.  
af60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
af70: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
af80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
af90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
afa0: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
afb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
afc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
afd0: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
afe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aff0: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
b000: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
b010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b020: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
b030: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
b040: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
b050: 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20  ->token.n>1 ){. 
b060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b070: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
b080: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
b090: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
b0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b0c0: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
b0d0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
b0e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b0f0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
b100: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
b110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b120: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
b130: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
b140: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
b150: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
b160: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
b170: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
b180: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b190: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
b1a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b1b0: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
b1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b1d0: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
b1e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
b1f0: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
b200: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
b210: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
b220: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
b230: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
b240: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b250: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b260: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
b270: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b280: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
b290: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
b2a0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
b2b0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
b2c0: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c  ->pRight, op, 0,
b2d0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b2f0: 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
b300: 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
b310: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
b320: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
b330: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
b340: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
b350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
b360: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
b370: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
b380: 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
b390: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
b3a0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
b3b0: 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
b3c0: 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
b3d0: 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
b3e0: 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
b3f0: 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
b400: 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
b410: 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
b420: 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
b430: 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
b440: 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
b450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b460: 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
b470: 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
b480: 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
b490: 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
b4a0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
b4b0: 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
b4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b4d0: 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
b4e0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b4f0: 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
b500: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
b510: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
b520: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
b530: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
b540: 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
b550: 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
b560: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b570: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b580: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
b590: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b5a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b5b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
b5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b5d0: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
b5e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b5f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
b600: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
b610: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
b620: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
b630: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
b640: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
b650: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
b660: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
b670: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
b680: 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c    Token *p = &pL
b690: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
b6a0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
b6b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
b6c0: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
b6d0: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
b6e0: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
b6f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
b700: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
b710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b720: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b730: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
b740: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
b750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b760: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
b770: 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  v, z, p->n+1);. 
b780: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b790: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
b7a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b7c0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
b7d0: 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20  o TK_NOT */.    
b7e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
b7f0: 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
b800: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
b810: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
b820: 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
b830: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b840: 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
b850: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b860: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b870: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b890: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
b8a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b8b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b8c0: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
b8d0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
b8e0: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
b8f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b900: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
b910: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
b920: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
b930: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
b940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b950: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b960: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
b970: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b980: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b990: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
b9a0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
b9b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
b9c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b9d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
b9e0: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
b9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ba00: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
ba10: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  -1, 0);.      br
ba20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ba30: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
ba40: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ION: {.      sql
ba50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ba60: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
ba70: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
ba80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba90: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
baa0: 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
bab0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
bac0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
bad0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
bae0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
baf0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20  nExpr = pList ? 
bb00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
bb10: 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
bb20: 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74  *pDef;.      int
bb30: 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73   nId;.      cons
bb40: 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20  t char *zId;.   
bb50: 20 20 20 69 6e 74 20 70 32 20 3d 20 30 3b 0a 20     int p2 = 0;. 
bb60: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
bb70: 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73    u8 enc = pPars
bb80: 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20  e->db->enc;.    
bb90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
bba0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 49 64 20   = 0;.      zId 
bbb0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  = pExpr->token.z
bbc0: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
bbd0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
bbe0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
bbf0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
bc00: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
bc10: 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
bc20: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
bc30: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
bc40: 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
bc50: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
bc60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
bc70: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  t);.      for(i=
bc80: 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
bc90: 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
bca0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
bcb0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
bcc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
bcd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 32 20 7c  {.          p2 |
bce0: 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
bcf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
bd00: 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
bd10: 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  q && !pColl ){. 
bd20: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
bd30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
bd40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
bd50: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
bd60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bd70: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
bd80: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
bd90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
bda0: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
bdb0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
bdc0: 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
bdd0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
bde0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
bdf0: 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
be00: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
be10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
be20: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
be30: 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72  _Function, nExpr
be40: 2c 20 70 32 2c 20 28 63 68 61 72 2a 29 70 44 65  , p2, (char*)pDe
be50: 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P3_FUNCDEF);.
be60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be70: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
be80: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
be90: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
bea0: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
beb0: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
bec0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
bed0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
bee0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
bef0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bf00: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
bf10: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  ->iColumn, 0);. 
bf20: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
bf30: 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75 62  ((v, "# load sub
bf40: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
bf50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bf60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bf70: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
bf80: 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  addr;.      char
bf90: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
bfa0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
bfb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
bfc0: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
bfd0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
bfe0: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
bff0: 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
c000: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
c010: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
c020: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
c030: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
c040: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
c050: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
c060: 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61    ** P3 of OP_Ma
c070: 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
c080: 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
c090: 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
c0a0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
c0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c0c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
c0d0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20  eger, 1, 0);..  
c0e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
c0f0: 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
c100: 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
c110: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c120: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
c130: 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
c140: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
c150: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
c160: 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
c170: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c180: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c190: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c1a0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c1b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c1c0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
c1d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c1e0: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
c1f0: 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
c200: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
c210: 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
c220: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c230: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
c240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c250: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
c260: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
c270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c280: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
c290: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
c2a0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
c2b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
c2c0: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
c2d0: 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20  , 1);   /* addr 
c2e0: 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 4 */.      sql
c2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c300: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
c310: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37  ->iTable, addr+7
c320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c340: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20  AddImm, -1, 0); 
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a   /* addr + 6 */.
c370: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c380: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
c390: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
c3a0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
c3b0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
c3c0: 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
c3d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c3e0: 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
c3f0: 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
c400: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
c410: 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
c420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c430: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
c440: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c450: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c460: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
c470: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c480: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
c490: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
c4a0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
c4b0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
c4c0: 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Ge, 0, 0);.     
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4e0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
c4f0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65   0);.      pLIte
c500: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
c510: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
c520: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
c530: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c540: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
c550: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c560: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
c570: 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b  t, OP_Le, 0, 0);
c580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e  beAddOp(v, OP_An
c5a0: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
c5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c5c0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a   case TK_UPLUS:.
c5d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
c5e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c5f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c600: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c620: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
c630: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
c640: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
c650: 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e        int jumpIn
c660: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  st;.      int ad
c670: 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  dr;.      int nE
c680: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
c690: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
c6a0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
c6b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c6c0: 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
c6d0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
c6e0: 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
c6f0: 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
c700: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
c710: 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
c720: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
c730: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
c740: 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
c750: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
c760: 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
c770: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
c780: 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
c790: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
c7a0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
c7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c7c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
c7d0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
c7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c7f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c800: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c810: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c820: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
c830: 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
c840: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c850: 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
c860: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  elem[i].pExpr);.
c870: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
c880: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
c890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
c8b0: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
c8c0: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f     jumpInst = co
c8d0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
c8e0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
c8f0: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
c900: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31       OP_Ne, 0, 1
c930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c950: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
c960: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c970: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
c980: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
c990: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
c9a0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
c9b0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
c9c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c9d0: 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
c9e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
c9f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ca00: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
ca10: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
ca20: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
ca30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ca40: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
ca50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca60: 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70  ChangeP2(v, jump
ca70: 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  Inst, addr);.   
ca80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ca90: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
caa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
cac0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
cad0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
cae0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
caf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb00: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
cb10: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
cb20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cb40: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
cb50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
cb60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cb70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
cb80: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
cb90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
cba0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
cbb0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
cbc0: 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
cbd0: 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
cbe0: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
cbf0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
cc00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cc10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
cc30: 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
cc40: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
cc50: 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
cc60: 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ");..return;.   
cc70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
cc80: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f  Expr->iColumn!=O
cc90: 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
cca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
ccb0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f  pr->iColumn==OE_
ccc0: 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20  Rollback ||.    
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
cce0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
ccf0: 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20  E_Abort ||.     
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
cd10: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
cd20: 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
cd30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
cd40: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
cd50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
cd60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
cd90: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
cda0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20  oken.n);.       
cdb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 71    sqlite3VdbeDeq
cdc0: 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20  uoteP3(v, -1);. 
cdd0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
cde0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cdf0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
ce00: 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20   OE_Ignore );.  
ce10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
ce30: 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b  ntextPop, 0, 0);
ce40: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
ce50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ce60: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
ce70: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e  ->trigStack->ign
ce80: 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20  oreJump);.      
ce90: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
cea0: 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f  v, "# raise(IGNO
ceb0: 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  RE)"));.      }.
cec0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ced0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23   break;.  }.}..#
cee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cef0: 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a  IT_TRIGGER./*.**
cf00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cf10: 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
cf20: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
cf30: 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65  n and leaves the
cf40: 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
cf50: 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61 6c  e stack.  See al
cf60: 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  so sqlite3ExprCo
cf70: 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  de()..**.** This
cf80: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
cf90: 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72 65  lso cache the re
cfa0: 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79 20  sult and modify 
cfb0: 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a 2a  the pExpr tree.*
cfc0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  * so that it wil
cfd0: 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68  l make use of th
cfe0: 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74 20  e cached result 
cff0: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65 76  on subsequent ev
d000: 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74  aluations.** rat
d010: 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61 74  her than evaluat
d020: 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72  e the whole expr
d030: 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54  ession again.  T
d040: 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69 6f  rivial expressio
d050: 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61  ns are.** not ca
d060: 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65 78  ched.  If the ex
d070: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63 68  pression is cach
d080: 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20 69  ed, its result i
d090: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a  s stored in a .*
d0a0: 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  * memory locatio
d0b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
d0c0: 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
d0d0: 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
d0e0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
d0f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
d100: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
d110: 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64   iMem;.  int add
d120: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66 28  r1, addr2;.  if(
d130: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
d140: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
d150: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d160: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (v);.  sqlite3Ex
d170: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d180: 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20 3d  Expr);.  addr2 =
d190: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d1a0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
d1b0: 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31 20  ( addr2>addr1+1 
d1c0: 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  || sqlite3VdbeGe
d1d0: 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f  tOp(v, addr1)->o
d1e0: 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69  pcode==OP_Functi
d1f0: 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d  on ){.    iMem =
d200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
d210: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d220: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
d240: 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
d250: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
d260: 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d  TK_REGISTER;.  }
d270: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d280: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d290: 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
d2a0: 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
d2b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
d2c0: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
d2d0: 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73   list onto the s
d2e0: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tack..**.** Retu
d2f0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
d300: 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64   elements pushed
d310: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
d320: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
d330: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
d340: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d350: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
d360: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d370: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
d380: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
d390: 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
d3a0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ded */.){.  stru
d3b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d3c0: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
d3d0: 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  , n;.  Vdbe *v;.
d3e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d3f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d   return 0;.  v =
d400: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d410: 70 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70  pParse);.  n = p
d420: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
d430: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
d440: 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
d450: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
d460: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d470: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
d480: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
d490: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
d4a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
d4b0: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
d4c0: 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
d4d0: 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
d4e0: 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
d4f0: 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
d500: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
d510: 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
d520: 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
d530: 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
d540: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d550: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
d560: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
d570: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
d580: 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
d590: 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
d5a0: 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
d5b0: 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
d5c0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  l flag is true..
d5d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
d5e0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
d5f0: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
d600: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
d610: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
d620: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
d630: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
d640: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
d650: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
d660: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
d670: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
d680: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
d690: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
d6a0: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
d6b0: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
d6c0: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
d6d0: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
d6e0: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
d6f0: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
d700: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
d710: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
d720: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
d730: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d740: 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
d750: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
d760: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
d770: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
d780: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
d790: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d7a0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
d7b0: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
d7c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
d7d0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
d7e0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
d7f0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
d800: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
d810: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d820: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d830: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
d840: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
d850: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
d860: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
d880: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
d890: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
d8a0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
d8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d8c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
d8d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d8e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d8f0: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
d900: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
d910: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d920: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
d930: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
d940: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
d950: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d960: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
d970: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
d980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d990: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
d9a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d9b0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
d9c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
d9d0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
d9e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d9f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
da00: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
da10: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
da20: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
da30: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
da40: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
da50: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
da60: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
da70: 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
da80: 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
da90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
daa0: 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
dab0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
dac0: 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
dad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
dae0: 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
daf0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
db00: 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
db10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
db20: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
db30: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
db40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
db50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
db60: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
db70: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
db80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
db90: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
dba0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
dbb0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
dbc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dbd0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
dbe0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
dbf0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
dc00: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
dc10: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
dc20: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
dc30: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
dc40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
dc50: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dc60: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
dc70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dc80: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
dc90: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
dca0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
dcb0: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
dcc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
dcd0: 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
dce0: 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
dcf0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
dd00: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
dd10: 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
dd20: 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
dd30: 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
dd40: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
dd50: 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
dd60: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
dd70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
dd80: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
dd90: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
dda0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
ddb0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
ddc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ddd0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dde0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ddf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
de00: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
de10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
de20: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
de30: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
de40: 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
de50: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
de60: 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
de70: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
de80: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
de90: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
dea0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
deb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
dec0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
ded0: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
dee0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
def0: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
df00: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
df10: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
df20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
df30: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
df40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
df50: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
df60: 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  dr, sqlite3VdbeC
df70: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
df80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
dfa0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
dfb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dfc0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
dfd0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
dfe0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
dff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e000: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
e010: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
e020: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
e030: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e040: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
e050: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
e060: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
e070: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
e080: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
e090: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
e0a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e0b0: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
e0c0: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
e0d0: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
e0e0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e0f0: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
e100: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e110: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
e120: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
e130: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
e140: 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
e150: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
e160: 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
e170: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
e180: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
e190: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
e1a0: 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
e1b0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
e1c0: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
e1d0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
e1e0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
e1f0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
e200: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
e210: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
e220: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
e230: 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
e240: 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
e250: 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
e260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
e270: 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
e280: 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
e290: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
e2a0: 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
e2b0: 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
e2c0: 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
e2d0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
e2e0: 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
e2f0: 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
e300: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
e310: 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
e320: 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
e330: 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
e340: 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
e350: 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
e360: 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
e370: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e390: 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
e3a0: 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
e3b0: 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
e3c0: 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
e3d0: 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
e3e0: 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
e3f0: 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
e400: 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
e410: 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
e420: 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
e430: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
e440: 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
e450: 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
e460: 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
e470: 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
e480: 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
e490: 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
e4a0: 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
e4b0: 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
e4c0: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
e4d0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
e4e0: 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
e4f0: 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
e500: 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
e510: 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
e520: 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
e530: 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
e540: 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
e550: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
e560: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
e570: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
e580: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
e590: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
e5a0: 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
e5b0: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
e5c0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e5d0: 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
e5e0: 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
e5f0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
e600: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
e610: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e620: 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
e630: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
e640: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e650: 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
e660: 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
e670: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
e680: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
e690: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6a0: 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
e6b0: 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
e6c0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
e6d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
e6e0: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AND: {.      sql
e6f0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e700: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e710: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
e720: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
e730: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
e740: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e750: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
e760: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
e770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e780: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
e790: 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
e7a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e7b0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
e7c0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
e7d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e7e0: 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
e7f0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
e800: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
e810: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e820: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
e830: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
e840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
e850: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
e860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e870: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e880: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
e890: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
e8a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e8b0: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
e8c0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
e8d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e8e0: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
e8f0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
e900: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
e910: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
e920: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
e930: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
e940: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e950: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e960: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e970: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e980: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e990: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
e9a0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
e9b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
e9c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
e9d0: 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
e9e0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
e9f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ea00: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
ea10: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
ea20: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
ea30: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ea40: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ea50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ea60: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
ea70: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
ea80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ea90: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
eaa0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
eab0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22   expression is "
eac0: 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
ead0: 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d  z". It is implem
eae0: 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
eaf0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
eb00: 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33   (x >= y) GOTO 3
eb10: 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f  .      ** 2 GOTO
eb20: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
eb30: 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f   3 IF (x > z) GO
eb40: 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
eb50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
eb60: 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
eb70: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
eb80: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
eb90: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
eba0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
ebb0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
ebc0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ebd0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
ebe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ebf0: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
ec00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec10: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ec20: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
ec30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ec40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ec50: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
ec60: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
ec70: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
ec80: 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49  , addr+3, !jumpI
ec90: 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
eca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ecb0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
ecc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ecd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
ece0: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
ecf0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
ed00: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
ed10: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
ed20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ed30: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
ed40: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
ed50: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
ed60: 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64  pRight, OP_Gt, d
ed70: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
ed80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ed90: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
eda0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
edb0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
edc0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
edd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ede0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75  (v, OP_IfNot, ju
edf0: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
ee00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ee10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ee20: 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
ee30: 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
ee40: 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
ee50: 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
ee60: 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
ee70: 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
ee80: 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
ee90: 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
eea0: 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69  in any way..*/.i
eeb0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
eec0: 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
eed0: 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
eee0: 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
eef0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
ef00: 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ==0;.  }else if(
ef10: 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
ef20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
ef30: 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
ef40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ef50: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
ef60: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
ef70: 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
ef80: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
ef90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
efa0: 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
efb0: 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
efc0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
efd0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
efe0: 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
eff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
f000: 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
f010: 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
f020: 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
f030: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f040: 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
f050: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
f060: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
f070: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
f080: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
f090: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
f0a0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
f0b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
f0c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
f0d0: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
f0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f0f0: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
f100: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
f110: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
f120: 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
f130: 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
f140: 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
f150: 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
f160: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
f170: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
f180: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
f190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
f1a0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
f1b0: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
f1c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
f1d0: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
f1e0: 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pA->token.z, p
f1f0: 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  B->token.z, pB->
f200: 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65  token.n)!=0 ) re
f210: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
f220: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
f230: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
f240: 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  nt to the pParse
f250: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
f260: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e  nd return its in
f270: 64 65 78 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20  dex..** The new 
f280: 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e 69 74 69  element is initi
f290: 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20  alized to zero. 
f2a0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
f2b0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 65 78 70 65  ction is.** expe
f2c0: 63 74 65 64 20 74 6f 20 66 69 6c 6c 20 69 74 20  cted to fill it 
f2d0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  in..*/.static in
f2e0: 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  t appendAggInfo(
f2f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
f300: 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e    if( (pParse->n
f310: 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Agg & 0x7)==0 ){
f320: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70  .    int amt = p
f330: 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b  Parse->nAgg + 8;
f340: 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61 41  .    AggExpr *aA
f350: 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  gg = sqliteReall
f360: 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67 2c  oc(pParse->aAgg,
f370: 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61 72   amt*sizeof(pPar
f380: 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20  se->aAgg[0]));. 
f390: 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20 29     if( aAgg==0 )
f3a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
f3b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
f3c0: 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67 67  rse->aAgg = aAgg
f3d0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
f3e0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61  pParse->aAgg[pPa
f3f0: 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73  rse->nAgg], 0, s
f400: 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41  izeof(pParse->aA
f410: 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72  gg[0]));.  retur
f420: 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b  n pParse->nAgg++
f430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f440: 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  is an xFunc for 
f450: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75  walkExprTree() u
f460: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
f470: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72   .** sqlite3Expr
f480: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
f490: 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
f4a0: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
f4b0: 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
f4c0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
f4d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
f4e0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
f4f0: 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
f500: 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70  function at pExp
f510: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f520: 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
f530: 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  e(void *pArg, Ex
f540: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
f550: 74 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20 2a  t i;.  AggExpr *
f560: 61 41 67 67 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  aAgg;.  NameCont
f570: 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65  ext *pNC = (Name
f580: 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a  Context *)pArg;.
f590: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
f5a0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
f5b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
f5c0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
f5d0: 73 74 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  st;..  switch( p
f5e0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
f5f0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
f600: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
f610: 20 70 53 72 63 4c 69 73 74 20 26 26 20 69 3c 70   pSrcList && i<p
f620: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
f630: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f640: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
f650: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
f660: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
f670: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
f680: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 20  e->aAgg;.       
f690: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f6a0: 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29  arse->nAgg; i++)
f6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
f6c0: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
f6d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f6e0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
f6f0: 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c  [i].pExpr->iTabl
f700: 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
f710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
f720: 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e   aAgg[i].pExpr->
f730: 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
f740: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
f750: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f760: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f780: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
f790: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
f7a0: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
f7b0: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
f7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f7d0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
f7e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
f7f0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
f800: 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Agg = 0;.       
f810: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67       pParse->aAg
f820: 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  g[i].pExpr = pEx
f830: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  pr;.          }.
f840: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
f850: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
f860: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
f870: 43 74 78 20 3d 20 70 4e 43 2d 3e 6e 44 65 70 74  Ctx = pNC->nDept
f880: 68 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  h;.          ret
f890: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
f8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f8b0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f8c0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
f8d0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
f8e0: 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
f900: 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Agg = pParse->aA
f910: 67 67 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  gg;.        for(
f920: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
f930: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
f940: 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69       if( !aAgg[i
f950: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
f960: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
f970: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
f980: 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78  pare(aAgg[i].pEx
f990: 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
f9a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f9b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
f9d0: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
f9e0: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gg ){.          
f9f0: 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  u8 enc = pParse-
fa00: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  >db->enc;.      
fa10: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
fa20: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
fa30: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30           if( i<0
fa40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
fa50: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
fa60: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31  Agg[i].isAgg = 1
fa70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
fa80: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70  se->aAgg[i].pExp
fa90: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
faa0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67       pParse->aAg
fab0: 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c  g[i].pFunc = sql
fac0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
fad0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
faf0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
fb00: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20  r->token.n,.    
fb10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
fb20: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
fb30: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
fb40: 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
fb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
fb60: 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
fb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
fb80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fb90: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
fba0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
fbb0: 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
fbc0: 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
fbd0: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
fbe0: 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
fbf0: 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43  e, pNC);.    pNC
fc00: 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a  ->nDepth--;.  }.
fc10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fc20: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
fc30: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
fc40: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
fc50: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
fc60: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
fc70: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
fc80: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
fc90: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
fca0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
fcb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
fcc0: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
fcd0: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
fce0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
fcf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fd00: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
fd10: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
fd20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
fd30: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
fd40: 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
fd50: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a  ResolveNames()..
fd60: 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20  **.** If errors 
fd70: 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20  are seen, leave 
fd80: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
fd90: 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20   in zErrMsg and 
fda0: 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  return.** the nu
fdb0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
fdc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
fdd0: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
fde0: 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
fdf0: 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
fe00: 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  r){.  int nErr =
fe10: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
fe20: 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  rr;.  walkExprTr
fe30: 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a  ee(pExpr, analyz
fe40: 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
fe50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e  ;.  return pNC->
fe60: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e  pParse->nErr - n
fe70: 45 72 72 3b 0a 7d 0a                             Err;.}.