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

Artifact 2ed29dc4f8feeb55eafa40d41941ad7909666863:


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 31 39 31 20 32 30 30 35 2f 30 32 2f 30 34 20  .191 2005/02/04 
0220: 30 34 3a 30 37 3a 31 37 20 64 61 6e 69 65 6c 6b  04:07:17 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 77 65 20 6c 65  loc fails, we le
1800: 61 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 70  ak memory from p
1810: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
1820: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
1830: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
1840: 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  = op;.  pNew->pL
1850: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70  eft = pLeft;.  p
1860: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  New->pRight = pR
1870: 69 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b  ight;.  if( pTok
1880: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1890: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
18a0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70   );.    pNew->sp
18b0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
18c0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
18d0: 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 26 26  lse if( pLeft &&
18e0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73   pRight ){.    s
18f0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
1900: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
1910: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
1920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1930: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pNew;.}../*.** W
1940: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
1950: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
1960: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
1970: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
1980: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
1990: 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31  ke this:   #0 #1
19a0: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
19b0: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c  erms refer to el
19c0: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65  ements.** on the
19d0: 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 28 6f   stack.  "#0" (o
19e0: 72 20 6a 75 73 74 20 22 23 22 29 20 6d 65 61 6e  r just "#") mean
19f0: 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  s the top of the
1a00: 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20   stack..** "#1" 
1a10: 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74 20 64  means the next d
1a20: 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  own on the stack
1a30: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1a40: 20 20 23 2d 31 20 6d 65 61 6e 73 0a 2a 2a 20 6d    #-1 means.** m
1a50: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 30  emory location 0
1a60: 2e 20 20 23 2d 32 20 6d 65 61 6e 73 20 6d 65 6d  .  #-2 means mem
1a70: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 31 2e 20  ory location 1. 
1a80: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
1a90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1aa0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1ab0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61  he parser to dea
1ac0: 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f  l with on of tho
1ad0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20  se terms..** It 
1ae0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65  immediately gene
1af0: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74  rates code to st
1b00: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1b10: 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69   a memory locati
1b20: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  on..** The retur
1b30: 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ns an expression
1b40: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20   that will code 
1b50: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1b60: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61  alue from.** tha
1b70: 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  t memory locatio
1b80: 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  n as needed..*/.
1b90: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67  Expr *sqlite3Reg
1ba0: 69 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20  isterExpr(Parse 
1bb0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1bc0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20  pToken){.  Vdbe 
1bd0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1be0: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  be;.  Expr *p;. 
1bf0: 20 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66   int depth;.  if
1c00: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
1c10: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1c20: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
1c30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c40: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
1c50: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
1c60: 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  rror", pToken);.
1c70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c80: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  }.  p = sqlite3E
1c90: 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c  xpr(TK_REGISTER,
1ca0: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
1cb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
1cc0: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1cd0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
1ce0: 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61  .  }.  depth = a
1cf0: 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  toi(&pToken->z[1
1d00: 5d 29 3b 0a 20 20 69 66 28 20 64 65 70 74 68 3e  ]);.  if( depth>
1d10: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69 54 61  =0 ){.    p->iTa
1d20: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
1d30: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1d50: 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29 3b  _Dup, depth, 0);
1d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
1d80: 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  tore, p->iTable,
1d90: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1da0: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31    p->iTable = -1
1db0: 2d 64 65 70 74 68 3b 0a 20 20 7d 0a 20 20 72 65  -depth;.  }.  re
1dc0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1dd0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1de0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1df0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1e00: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1e10: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1e20: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1e30: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1e40: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1e50: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1e60: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1e70: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1e80: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1e90: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1ea0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1eb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1ec0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1ed0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1ee0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1ef0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1f00: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1f10: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1f20: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1f30: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1f40: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
1f50: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
1f60: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
1f70: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
1f80: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
1f90: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1fa0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
1fb0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
1fc0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
1fd0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
1fe0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
1ff0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
2000: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
2010: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
2020: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2030: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2040: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2050: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2060: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2070: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
2080: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2090: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
20a0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
20b0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
20c0: 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20  Addr(pRight->z) 
20d0: 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29  - Addr(pLeft->z)
20e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20f0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
2100: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2110: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
2120: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
2130: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
2140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
2150: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
2160: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
2170: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
2180: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
2190: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
21a0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
21b0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
21c0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
21d0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
21e0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  w==0 ){.    /* s
21f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2200: 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2f 20  lete(pList); // 
2210: 4c 65 61 6b 20 70 4c 69 73 74 20 77 68 65 6e 20  Leak pList when 
2220: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2230: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2240: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  }.  pNew->op = T
2250: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
2260: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
2270: 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  t;.  if( pToken 
2280: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2290: 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b  Token->dyn==0 );
22a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
22b0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
22c0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
22d0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  oken.z = 0;.  }.
22e0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
22f0: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65  New->token;.  re
2300: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2310: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2320: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2330: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2340: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2350: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2360: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2370: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2380: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2390: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
23a0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
23b0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
23c0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
23d0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
23e0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
23f0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2400: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2410: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2420: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2430: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2440: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2450: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2460: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2470: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2480: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2490: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
24a0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
24b0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
24c0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
24d0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
24e0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
24f0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2500: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2510: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2520: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2530: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2540: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2550: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2560: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2570: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2580: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2590: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
25a0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
25b0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25c0: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
25d0: 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  en;.  if( pExpr=
25e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
25f0: 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e  Token = &pExpr->
2600: 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  token;.  assert(
2610: 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b   pToken->n>=1 );
2620: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2630: 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  n->z!=0 );.  ass
2640: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  ert( pToken->z[0
2650: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  ]!=0 );.  if( pT
2660: 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20  oken->n==1 ){.  
2670: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
2680: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
2690: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
26a0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
26b0: 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  */.    pExpr->iT
26c0: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
26d0: 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69  >nVar;.  }else i
26e0: 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  f( pToken->z[0]=
26f0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ='?' ){.    /* W
2700: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
2710: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
2720: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
2730: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
2740: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
2750: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
2760: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r */.    int i;.
2770: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2780: 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 26 70 54  e = i = atoi(&pT
2790: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
27a0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
27b0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
27c0: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
27d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27e0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
27f0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
2800: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
2810: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
2820: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
2830: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
2840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
2850: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
2860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2870: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
2880: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
2890: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
28a0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
28b0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
28c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
28d0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
28e0: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
28f0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2900: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
2910: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
2920: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
2930: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
2940: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
2950: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
2960: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
2970: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
2980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2990: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
29a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
29b0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
29c0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
29d0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
29e0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
29f0: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
2a00: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
2a10: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
2a20: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
2a30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a40: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
2a50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
2a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a70: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
2a80: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
2a90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2aa0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2ab0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
2ac0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
2ad0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2ae0: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
2af0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2b00: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
2b10: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b20: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
2b30: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2b40: 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  pr = sqliteReall
2b50: 6f 63 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  oc(pParse->apVar
2b60: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2b80: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b90: 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  oc*sizeof(pParse
2ba0: 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 20  ->apVarExpr[0]) 
2bb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2bc0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61   if( !sqlite3_ma
2bd0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
2be0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2bf0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2c00: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
2c10: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2c20: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
2c30: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
2c40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
2c60: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
2c70: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
2c80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c90: 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20  ExprDelete(Expr 
2ca0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
2cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2cc0: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
2cd0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2ce0: 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66  p->span.z);.  if
2cf0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29  ( p->token.dyn )
2d00: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2d10: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
2d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2d30: 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  ete(p->pLeft);. 
2d40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2d50: 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  te(p->pRight);. 
2d60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2d70: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29  Delete(p->pList)
2d80: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2d90: 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65  tDelete(p->pSele
2da0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
2db0: 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  e(p);.}.../*.** 
2dc0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
2dd0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
2de0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
2df0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
2e00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
2e10: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
2e20: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
2e30: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
2e40: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
2e50: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
2e60: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
2e70: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
2e80: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
2e90: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
2ea0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
2eb0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
2ec0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
2ed0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
2ee0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
2ef0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2f00: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
2f10: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
2f20: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
2f30: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
2f40: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
2f50: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
2f60: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2f70: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
2f80: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
2f90: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
2fa0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
2fb0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
2fc0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a   duplicated..*/.
2fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2fe0: 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20  rDup(Expr *p){. 
2ff0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
3000: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3010: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3020: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
3030: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3040: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3050: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
3060: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
3070: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
3080: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
3090: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
30a0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
30b0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e  (p->token.z, p->
30c0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e  token.n);.    pN
30d0: 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  ew->token.dyn = 
30e0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
30f0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
3100: 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a  ken.z==0 );.  }.
3110: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d    pNew->span.z =
3120: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66   0;.  pNew->pLef
3130: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3140: 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  up(p->pLeft);.  
3150: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
3160: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
3170: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77  >pRight);.  pNew
3180: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
3190: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
31a0: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
31b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
31c0: 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53  3SelectDup(p->pS
31d0: 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
31e0: 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71   pNew;.}.void sq
31f0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54  lite3TokenCopy(T
3200: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
3210: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
3220: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
3230: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f  eFree((char*)pTo
3240: 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  ->z);.  if( pFro
3250: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d  m->z ){.    pTo-
3260: 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20  >n = pFrom->n;. 
3270: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71 6c 69     pTo->z = sqli
3280: 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f 6d 2d  teStrNDup(pFrom-
3290: 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20  >z, pFrom->n);. 
32a0: 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b     pTo->dyn = 1;
32b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
32c0: 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  o->z = 0;.  }.}.
32d0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
32e0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 45 78 70  3ExprListDup(Exp
32f0: 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70  rList *p){.  Exp
3300: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
3310: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
3320: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
3330: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
3340: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3350: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3360: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
3370: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
3380: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3390: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
33a0: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
33b0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
33c0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
33d0: 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tem = sqliteMall
33e0: 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  oc( p->nExpr*siz
33f0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
3400: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
3410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
3420: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
3430: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
3440: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
3450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
3460: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
3470: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
3480: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
3490: 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20  pr, *pOldExpr;. 
34a0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
34b0: 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c  = pNewExpr = sql
34c0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64  ite3ExprDup(pOld
34d0: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
34e0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
34f0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
3500: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
3510: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
3520: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
3530: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
3540: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
3550: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
3560: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
3570: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
3580: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
3590: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
35a0: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
35b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
35c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
35d0: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
35e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
35f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
3600: 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45 78 70  kenCopy(&pNewExp
3610: 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78  r->span, &pOldEx
3620: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  pr->span);.    }
3630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
3640: 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77  wExpr==0 || pNew
3650: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
3660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
3670: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pOldExpr->span.z
3680: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
3690: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a  alloc_failed );.
36a0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
36b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
36c0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
36d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
36e0: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
36f0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
3700: 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d    pItem->isAgg =
3710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67   pOldItem->isAgg
3720: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
3730: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3740: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3750: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
3760: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
3770: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
3780: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
3790: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
37a0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
37b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
37c0: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
37d0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
37e0: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
37f0: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
3800: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
3810: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
3820: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
3830: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
3840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3850: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
3860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3870: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
3880: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3890: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
38a0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
38b0: 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69  SrcListDup(SrcLi
38c0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
38d0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
38e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
38f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3900: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
3910: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
3920: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
3930: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
3940: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
3950: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3960: 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b  locRaw( nByte );
3970: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3990: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
39a0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
39b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
39c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
39d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
39e0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
39f0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3a00: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
3a10: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
3a20: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
3a30: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
3a40: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
3a50: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
3a60: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
3a70: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
3a80: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3a90: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3aa0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
3ab0: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
3ac0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
3ad0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
3ae0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
3af0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
3b00: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
3b10: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
3b20: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
3b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62    pNewItem->pTab
3b40: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74   = 0;.    pNewIt
3b50: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
3b60: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3b70: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
3b80: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3b90: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
3ba0: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
3bb0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
3bc0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
3bd0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
3be0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
3bf0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
3c00: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
3c10: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
3c20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3c30: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
3c40: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
3c50: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
3c60: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3c70: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3c80: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3c90: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3ca0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3cb0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3cc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3cd0: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
3ce0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
3cf0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
3d00: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
3d10: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
3d20: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
3d30: 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  w->a==0 ) return
3d40: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
3d50: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
3d60: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3d70: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3d80: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3d90: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3da0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3db0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
3dc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
3dd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3de0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3df0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
3e00: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
3e10: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
3e20: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
3e30: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
3e40: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
3e50: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
3e60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3e70: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
3e80: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
3e90: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3ea0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3eb0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
3ec0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
3ed0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
3ee0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
3ef0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
3f00: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
3f10: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
3f20: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
3f30: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
3f40: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3f50: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
3f60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
3f70: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
3f80: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
3f90: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
3fa0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
3fb0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
3fc0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
3fd0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
3fe0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
3ff0: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4010: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4020: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4030: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4040: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c  ->nLimit = p->nL
4050: 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  imit;.  pNew->nO
4060: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
4070: 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  et;.  pNew->iLim
4080: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
4090: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
40a0: 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65 6d   pNew->ppOpenTem
40b0: 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  p = 0;.  pNew->p
40c0: 46 65 74 63 68 20 3d 20 30 3b 0a 20 20 70 4e 65  Fetch = 0;.  pNe
40d0: 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  w->isResolved = 
40e0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  0;.  pNew->isAgg
40f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
4100: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
4110: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
4120: 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29  ctDup(Select *p)
4130: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
4140: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
4150: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
4160: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
4170: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
4180: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
4190: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
41a0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
41b0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
41c0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
41d0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
41e0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
41f0: 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c  ListAppend(ExprL
4200: 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72  ist *pList, Expr
4210: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
4220: 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c  pName){.  if( pL
4230: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
4240: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
4250: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
4260: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
4270: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
4280: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
4290: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f  Delete(pExpr); /
42a0: 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66  / Leak memory if
42b0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
42d0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
42e0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
42f0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
4300: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
4310: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
4320: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
4330: 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
4340: 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69  c*2 + 4;.    pLi
4350: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
4360: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4370: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
4380: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
4390: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
43a0: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
43b0: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
43c0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
43d0: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
43e0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
43f0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78        pList->nEx
4400: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  pr = pList->nAll
4410: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  oc = 0;.      re
4420: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20  turn pList;.    
4430: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
4440: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
4450: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
4460: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
4470: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4480: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
4490: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
44a0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
44b0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
44c0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
44d0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
44e0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  pr;.    pItem->z
44f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4500: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4510: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4520: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
4530: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
4540: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
4550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4560: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4570: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
4580: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
4590: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
45a0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
45b0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
45c0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
45d0: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
45e0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
45f0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
4600: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
4610: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
4620: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
4630: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
4640: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
4650: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
4660: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
4670: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4680: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
4690: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
46a0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
46b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
46c0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
46d0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
46e0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
46f0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
4700: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
4710: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
4720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
4730: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
4740: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
4750: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
4760: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
4770: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
4780: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
4790: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
47a0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
47b0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
47c0: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
47d0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
47e0: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
47f0: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
4800: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
4810: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
4820: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
4830: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4840: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
4850: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
4860: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
4870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4880: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
4890: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
48a0: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
48b0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
48c0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
48d0: 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ist;.  int rc;. 
48e0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
48f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
4900: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
4910: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
4920: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
4930: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4940: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
4950: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4960: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4970: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
4980: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
4990: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
49a0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70      pList = pExp
49b0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
49c0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
49d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
49e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
49f0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
4a00: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
4a10: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
4a20: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
4a30: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
4a40: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4a50: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
4a60: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4a70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4a90: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
4aa0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4ab0: 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61  is designed as a
4ac0: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
4ad0: 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a  ExprTree()..**.*
4ae0: 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79  * pArg is really
4af0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4b00: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65   integer.  If we
4b10: 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f   can tell by loo
4b20: 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72  king.** at pExpr
4b30: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
4b40: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
4b50: 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  ns pExpr is not 
4b60: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  a constant.** ex
4b70: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73  pression, then s
4b80: 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e  et *pArg to 0 an
4b90: 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62  d return 2 to ab
4ba0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
4bb0: 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72  alk..** If pExpr
4bc0: 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64   does does not d
4bd0: 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78  isqualify the ex
4be0: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65  pression from be
4bf0: 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  ing a constant.*
4c00: 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  * then do nothin
4c10: 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77  g..**.** After w
4c20: 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65  alking the whole
4c30: 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64   tree, if no nod
4c40: 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61  es are found tha
4c50: 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20  t disqualify.** 
4c60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
4c70: 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
4c80: 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77   we assume the w
4c90: 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  hole expression.
4ca0: 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  ** is constant. 
4cb0: 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
4cc0: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72  IsConstant() for
4cd0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
4ce0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
4cf0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
4d00: 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a  sConstant(void *
4d10: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
4d20: 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45  r){.  switch( pE
4d30: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
4d40: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
4d50: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
4d60: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a     case TK_DOT:.
4d70: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
4d80: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
4d90: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
4da0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4db0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
4dc0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
4dd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
4de0: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
4df0: 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20    *((int*)pArg) 
4e00: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
4e10: 6e 20 32 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 2;.    default
4e20: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
4e30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
4e40: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
4e50: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
4e60: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
4e70: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
4e80: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
4e90: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
4ea0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
4eb0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
4ec0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
4ed0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
4ee0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
4ef0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
4f00: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
4f10: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
4f20: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
4f30: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
4f40: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
4f50: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
4f60: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
4f70: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
4f80: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
4f90: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
4fa0: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
4fb0: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
4fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
4fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
4fe0: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
4ff0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
5000: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
5010: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
5020: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
5030: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
5040: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
5050: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
5060: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
5070: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
5080: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
5090: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
50a0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
50b0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
50c0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
50d0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
50e0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
50f0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
5100: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
5110: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77  t *pValue){.  sw
5120: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
5130: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
5140: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
5150: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
5160: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
5170: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
5180: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
51a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
51b0: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
51c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
51d0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
51e0: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
51f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5200: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
5210: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
5220: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
5230: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
5240: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
5250: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
5260: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5280: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5290: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
52a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
52b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
52c0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
52d0: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
52e0: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
52f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
5300: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
5310: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
5320: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
5330: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
5340: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5350: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5360: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
5370: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5380: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5390: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
53a0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
53b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
53c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
53d0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
53e0: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
53f0: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
5400: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
5410: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
5420: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
5430: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
5440: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
5450: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
5460: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
5470: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
5480: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
5490: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
54a0: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
54b0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
54c0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
54d0: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
54e0: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
54f0: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
5520: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
5530: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
5540: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
5550: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5560: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
5570: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5580: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
5590: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
55a0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
55b0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
55c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
55d0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
55e0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
55f0: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
5600: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
5610: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
5620: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
5630: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
5640: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
5650: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
5660: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
5670: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
5680: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
5690: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
56a0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
56b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
56c0: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
56d0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
56e0: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
56f0: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
5700: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
5710: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
5720: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
5730: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
5740: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
5750: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5760: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
5770: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
5780: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
5790: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
57a0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
57b0: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
57c0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
57d0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
57e0: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
57f0: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
5800: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
5810: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
5820: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
5830: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
5840: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
5850: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5860: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
5870: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
5880: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
5890: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
58a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
58b0: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
58c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
58d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
58e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
58f0: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
5900: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5910: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
5920: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
5930: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
5940: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
5950: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
5960: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
5970: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
5980: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
5990: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
59a0: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
59b0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
59c0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
59d0: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
59e0: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
59f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
5a00: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
5a10: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
5a20: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
5a30: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
5a40: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
5a50: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
5a60: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5a70: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
5a80: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
5a90: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
5aa0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5ab0: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
5ac0: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
5ad0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
5ae0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
5af0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
5b00: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
5b10: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
5b20: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5b30: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
5b40: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
5b50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
5b60: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
5b70: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
5b80: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
5b90: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
5ba0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
5bb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5bc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
5bd0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
5be0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5bf0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
5c00: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
5c10: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
5c20: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
5c30: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
5c40: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
5c50: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
5c60: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
5c70: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
5c80: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
5c90: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5ca0: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
5cb0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  the list */..  a
5cc0: 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f  ssert( pColumnTo
5cd0: 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ken && pColumnTo
5ce0: 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65  ken->z ); /* The
5cf0: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
5d00: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
5d10: 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  zDb = sqlite3Nam
5d20: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f  eFromToken(pDbTo
5d30: 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73  ken);.  zTab = s
5d40: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5d50: 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29  ken(pTableToken)
5d60: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
5d70: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5d80: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
5d90: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
5da0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
5db0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
5dc0: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
5dd0: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
5de0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
5df0: 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  }..  pExpr->iTab
5e00: 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  le = -1;.  while
5e10: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
5e20: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
5e30: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
5e40: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45 78  pSrcList;.    Ex
5e50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
5e60: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   pNC->pEList;.. 
5e70: 20 20 20 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a     pNC->nRef++;.
5e80: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a      /* assert( z
5e90: 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  Tab==0 || pEList
5ea0: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ==0 ); */.    if
5eb0: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
5ec0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
5ed0: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
5ee0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
5ef0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
5f00: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
5f10: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
5f20: 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ab;.        Colu
5f30: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20  mn *pCol;.  .   
5f40: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
5f50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
5f70: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  b->nCol>0 );.   
5f80: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
5f90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5fa0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
5fc0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
5fd0: 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
5fe0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
5ff0: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
6000: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
6010: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6020: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6030: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6040: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
6050: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
6060: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
6070: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
6080: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
6090: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
60a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
60b0: 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69  ( zDb!=0 && sqli
60c0: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
60d0: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
60e0: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
6100: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6120: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6130: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
6140: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
6150: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6160: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
6170: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  r;.          pEx
6180: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
6190: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  iDb;.          p
61a0: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
61b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
61c0: 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70   for(j=0, pCol=p
61d0: 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
61e0: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
61f0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
6200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6210: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
6220: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
6230: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
6240: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6250: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
6260: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
6270: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
6280: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
6290: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
62a0: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
62b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
62c0: 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20  itute the rowid 
62d0: 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20  (column -1) for 
62e0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
62f0: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
6300: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
6310: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
6320: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
6330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6340: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
6350: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
6360: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
6370: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
6380: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
6390: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
63a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
63b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
63c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
63d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
63e0: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f  IT_TRIGGER.    /
63f0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
6400: 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65   already resolve
6410: 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e  d the name, then
6420: 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69   maybe .    ** i
6430: 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20  t is a new.* or 
6440: 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72  old.* trigger ar
6450: 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  gument reference
6460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6470: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
6480: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
6490: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
64a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69  !=0 ){.      Tri
64b0: 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67  ggerStack *pTrig
64c0: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
64d0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
64e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
64f0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
6500: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
6510: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
6520: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65  lite3StrICmp("ne
6530: 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29  w", zTab) == 0 )
6540: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
6550: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
6560: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b  erStack->newIdx;
6570: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6580: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
6590: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
65a0: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
65b0: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
65c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69    }else if( pTri
65d0: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
65e0: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
65f0: 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c  e3StrICmp("old",
6600: 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   zTab)==0 ){.   
6610: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6620: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
6630: 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20  ck->oldIdx;.    
6640: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
6650: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
6660: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
6670: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
6680: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a  >pTab;.      }..
6690: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
66a0: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  { .        int j
66b0: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
66c0: 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *pCol = pTab->a
66d0: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  Col;..        pE
66e0: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
66f0: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63 6e  >iDb;.        cn
6700: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tTab++;.        
6710: 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54 61  for(j=0; j < pTa
6720: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
6730: 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20  ol++) {.        
6740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6750: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
6760: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6770: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
6780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6790: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
67a0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
67b0: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
67c0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
67d0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
67e0: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
67f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6800: 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  pColl = pTab->aC
6810: 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
6820: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6830: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6840: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6850: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
6860: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6870: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
6880: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
6890: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
68a0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
68b0: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
68c0: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
68d0: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
68e0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
68f0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
6900: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
6910: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
6920: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
6930: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
6940: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
6950: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
6960: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
6970: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
6980: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
6990: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
69a0: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
69b0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
69c0: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
69d0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
69e0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
69f0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
6a00: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
6a10: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
6a20: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
6a30: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
6a40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
6a50: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
6a60: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
6a70: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
6a80: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
6a90: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
6aa0: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
6ab0: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
6ac0: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
6ad0: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
6ae0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
6af0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
6b00: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
6b10: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
6b20: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
6b30: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
6b40: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
6b50: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
6b60: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
6b70: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
6b80: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6b90: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
6ba0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
6bb0: 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21 3d  t==0 && pEList!=
6bc0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
6bd0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6be0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
6bf0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
6c00: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
6c10: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
6c20: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
6c30: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6c40: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
6c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
6c60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
6c70: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
6c80: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
6c90: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6ca0: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
6cb0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6cc0: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
6cd0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
6ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6cf0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
6d00: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pr);.          s
6d10: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
6d20: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
6d30: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
6d40: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
6d50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
6d70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
6d80: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
6d90: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20   name context.  
6da0: 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78  The loop will ex
6db0: 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20  it when either. 
6dc0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20     ** we have a 
6dd0: 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72  match (cnt>0) or
6de0: 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74   when we run out
6df0: 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74   of name context
6e00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
6e10: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
6e20: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
6e30: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
6e40: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e   /*.  ** If X an
6e50: 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e  d Y are NULL (in
6e60: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
6e70: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
6e80: 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73  name Z is.  ** s
6e90: 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65  upplied) and the
6ea0: 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65   value of Z is e
6eb0: 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c  nclosed in doubl
6ec0: 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20  e-quotes, then. 
6ed0: 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e   ** Z is a strin
6ee0: 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20  g literal if it 
6ef0: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e  doesn't match an
6f00: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  y column names. 
6f10: 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61   In that.  ** ca
6f20: 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  se, we need to r
6f30: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
6f40: 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e   and not make an
6f50: 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a  y changes to.  *
6f60: 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20  * pExpr..  */.  
6f70: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
6f80: 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e  ab==0 && pColumn
6f90: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27  Token->z[0]=='"'
6fa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
6fb0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65  ee(zCol);.    re
6fc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
6fd0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
6fe0: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
6ff0: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
7000: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
7010: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
7020: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
7030: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
7040: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
7050: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
7060: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a     char *z = 0;.
7070: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
7080: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
7090: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
70a0: 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69  umn: %s" : "ambi
70b0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
70c0: 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20  e: %s";.    if( 
70d0: 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  zDb ){.      sql
70e0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
70f0: 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62  , zDb, ".", zTab
7100: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
7110: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7120: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7130: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7140: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7150: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l, 0);.    }else
7160: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
7170: 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a  teStrDup(zCol);.
7180: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7190: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
71a0: 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20  , zErr, z);.    
71b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
71c0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
71d0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
71e0: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
71f0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
7200: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
7210: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
7220: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
7230: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
7240: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
7250: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
7260: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
7270: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
7280: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
7290: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
72a0: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
72b0: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
72c0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
72d0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
72e0: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
72f0: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
7300: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
7310: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
7320: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
7330: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
7340: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
7350: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
7360: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73  mn;.    if( n>=s
7370: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
7380: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69   ){.      n = si
7390: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d  zeof(Bitmask)*8-
73a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
73b0: 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75  ert( pMatch->iCu
73c0: 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  rsor==pExpr->iTa
73d0: 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63  ble );.    pMatc
73e0: 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c  h->colUsed |= 1<
73f0: 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  <n;.  }..  /* Cl
7400: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
7410: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  n.  */.  sqliteF
7420: 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69  ree(zDb);.  sqli
7430: 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  teFree(zTab);.  
7440: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29  sqliteFree(zCol)
7450: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
7460: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
7470: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
7480: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
7490: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
74a0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
74b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
74c0: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
74d0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 69 66 28  TK_COLUMN;.  if(
74e0: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
74f0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
7500: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
7510: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
7520: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
7530: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
7540: 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a   cnt!=1;.}../*.*
7550: 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64  * pExpr is a nod
7560: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
7570: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d   function of som
7580: 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68  e kind.  It migh
7590: 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63  t.** be a syntac
75a0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b  tic function lik
75b0: 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20  e "count(x)" or 
75c0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75  it might be a fu
75d0: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69  nction.** that i
75e0: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65  mplements an ope
75f0: 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c  rator, like "a L
7600: 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  IKE b".  .**.** 
7610: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
7620: 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74  es *pzName point
7630: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
7640: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  the function and
7650: 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c   .** *pnName hol
7660: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7670: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
7680: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
7690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
76a0: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
76b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
76c0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65  st char **pzName
76d0: 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a  , int *pnName){.
76e0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
76f0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7700: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
7710: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70       *pzName = p
7720: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
7730: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70       *pnName = p
7740: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
7750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7760: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
7770: 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  KE: {.      *pzN
7780: 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20  ame = "like";.  
7790: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
77a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
77b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
77c0: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70  GLOB: {.      *p
77d0: 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a  zName = "glob";.
77e0: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
77f0: 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;.      break;.
7800: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7810: 4b 5f 43 54 49 4d 45 3a 20 7b 0a 20 20 20 20 20  K_CTIME: {.     
7820: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72   *pzName = "curr
7830: 65 6e 74 5f 74 69 6d 65 22 3b 0a 20 20 20 20 20  ent_time";.     
7840: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
7850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7860: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44  }.    case TK_CD
7870: 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  ATE: {.      *pz
7880: 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f  Name = "current_
7890: 64 61 74 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e  date";.      *pn
78a0: 4e 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20  Name = 12;.     
78b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
78c0: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 53    case TK_CTIMES
78d0: 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20 20 2a 70  TAMP: {.      *p
78e0: 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74  zName = "current
78f0: 5f 74 69 6d 65 73 74 61 6d 70 22 3b 0a 20 20 20  _timestamp";.   
7900: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 37 3b     *pnName = 17;
7910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7920: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7940: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
7950: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
7960: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
7970: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
7980: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
7990: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
79a0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
79b0: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
79c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
79d0: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
79e0: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
79f0: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
7a00: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
7a10: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
7a20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7a30: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
7a40: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
7a50: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
7a60: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
7a70: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
7a80: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
7a90: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
7aa0: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
7ab0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
7ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
7ad0: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
7ae0: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
7af0: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
7b00: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
7b10: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
7b20: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
7b30: 69 73 74 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  ist;.  Parse *pP
7b40: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70 45 78  arse;..  if( pEx
7b50: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pr==0 ) return 1
7b60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21  ;.  assert( pNC!
7b70: 3d 30 20 29 3b 0a 20 20 70 53 72 63 4c 69 73 74  =0 );.  pSrcList
7b80: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7b90: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
7ba0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
7bb0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
7bc0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
7bd0: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
7be0: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
7bf0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7c00: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
7c10: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
7c20: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
7c30: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
7c40: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
7c50: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7c60: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
7c70: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
7c80: 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d  >=0 && pSrcList-
7c90: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50  >a[i].iCursor<pP
7ca0: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20  arse->nTab);.   
7cb0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
7cc0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
7cd0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
7ce0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
7cf0: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
7d00: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
7d10: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
7d20: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
7d30: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
7d40: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
7d50: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
7d60: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
7d70: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
7d80: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
7d90: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
7da0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
7db0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7dc0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
7dd0: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
7de0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
7df0: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
7e00: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
7e10: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
7e20: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
7e30: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
7e40: 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d  ifier is the nam
7e50: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20  e of a column.. 
7e60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
7e70: 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f  K_ID: {.      lo
7e80: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
7e90: 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74   0, 0, &pExpr->t
7ea0: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
7eb0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7ec0: 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
7ed0: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
7ee0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
7ef0: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
7f00: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
7f10: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
7f20: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
7f30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
7f40: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b  DOT: {.      Tok
7f50: 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  en *pColumn;.   
7f60: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65     Token *pTable
7f70: 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  ;.      Token *p
7f80: 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  Db;.      Expr *
7f90: 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f  pRight;..      /
7fa0: 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d  * if( pSrcList==
7fb0: 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20  0 ) break; */.  
7fc0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
7fd0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
7fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
7ff0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
8000: 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20     pDb = 0;.    
8010: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45      pTable = &pE
8020: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
8030: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75  n;.        pColu
8040: 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f  mn = &pRight->to
8050: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ken;.      }else
8060: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8070: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
8080: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _DOT );.        
8090: 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  pDb = &pExpr->pL
80a0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
80b0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52      pTable = &pR
80c0: 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  ight->pLeft->tok
80d0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  en;.        pCol
80e0: 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  umn = &pRight->p
80f0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
8100: 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b      }.      look
8110: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  upName(pParse, p
8120: 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c  Db, pTable, pCol
8130: 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  umn, pNC, pExpr)
8140: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
8150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8160: 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  Resolve function
8170: 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20   names.    */.  
8180: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 3a    case TK_CTIME:
8190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49  .    case TK_CTI
81a0: 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63 61 73  MESTAMP:.    cas
81b0: 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20 20 20  e TK_CDATE:.    
81c0: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
81d0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
81e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
81f0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
8200: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
8210: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
8220: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
8230: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
8240: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
8250: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
8260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
8270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
8280: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
8290: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
82a0: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
82b0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
82c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
82d0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
82e0: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
82f0: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
8300: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8310: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
8320: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8330: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
8340: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8350: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
8360: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   i;.      int nI
8370: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8380: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8390: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
83a0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
83b0: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
83c0: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
83d0: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
83e0: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
83f0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8410: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
8420: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
8430: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
8440: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
8450: 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  enc;  /* The dat
8460: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
8470: 2f 0a 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63  /..      getFunc
8480: 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20  tionName(pExpr, 
8490: 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20  &zId, &nId);.   
84a0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
84b0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
84c0: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
84d0: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
84e0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
84f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
8500: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
8510: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
8520: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
8530: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
8540: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
8550: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
8560: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
8570: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8580: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
8590: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
85a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
85b0: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
85c0: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
85d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
85e0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
85f0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
8600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8610: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8620: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
8630: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
8640: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
8650: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8660: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8670: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
8680: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
8690: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
86a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
86b0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
86c0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
86d0: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
86e0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
86f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
8700: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
8710: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8720: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8730: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
8740: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8750: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
8760: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
8770: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
8780: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
8790: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
87a0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
87b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
87c0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
87d0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
87e0: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
87f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8800: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
8810: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
8820: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
8830: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
8840: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
8850: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
8860: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
8870: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
8880: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
8890: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
88a0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
88b0: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
88c0: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
88d0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
88e0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
88f0: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
8900: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
8910: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
8920: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
8930: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
8940: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8950: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
8960: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
8970: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
8980: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
8990: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
89a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
89b0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
89c0: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
89d0: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ref;.        sql
89e0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
89f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8a00: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
8a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8a20: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
8a30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
8a40: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
8a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
8a60: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
8a70: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
8a80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8a90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8aa0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8ab0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8ac0: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
8ad0: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
8ae0: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
8af0: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
8b00: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
8b10: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
8b20: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
8b30: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
8b40: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
8b50: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
8b60: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
8b70: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
8b80: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
8b90: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
8ba0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
8bb0: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
8bc0: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
8bd0: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
8be0: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
8bf0: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
8c00: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
8c10: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
8c20: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
8c30: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
8c40: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
8c50: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
8c60: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
8c70: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
8c80: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
8c90: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
8ca0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
8cb0: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
8cc0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
8cd0: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
8ce0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
8cf0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
8d00: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
8d10: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
8d20: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
8d30: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
8d40: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
8d50: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
8d60: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
8d70: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
8d80: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
8d90: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
8da0: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
8db0: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
8dc0: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
8dd0: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
8de0: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
8df0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
8e00: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
8e10: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
8e20: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
8e30: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
8e40: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
8e50: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
8e60: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
8e70: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
8e80: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
8e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8ea0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
8eb0: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
8ec0: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
8ed0: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
8ee0: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
8ef0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
8f00: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
8f10: 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65  lveNames(.  Name
8f20: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
8f30: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
8f40: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
8f50: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
8f60: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
8f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8f80: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
8f90: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
8fa0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
8fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61  ) return 0;.  wa
8fc0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
8fd0: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
8fe0: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
8ff0: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
9000: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9010: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9020: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
9030: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
9040: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
9050: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
9060: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
9070: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
9080: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
9090: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
90a0: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
90b0: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
90c0: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
90d0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
90e0: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
90f0: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
9100: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
9110: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
9120: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
9130: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
9140: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
9150: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
9160: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
9170: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
9180: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9190: 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65   code for subque
91a0: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
91b0: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20  ators..**.** IN 
91c0: 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20  operators comes 
91d0: 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  in two forms:.**
91e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
91f0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
9200: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
9210: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9220: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
9230: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9240: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
9250: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
9260: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
9270: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
9280: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
9290: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
92a0: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
92b0: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
92c0: 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  y table..*/.#ifn
92d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
92e0: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
92f0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9300: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9310: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9320: 20 20 69 6e 74 20 6c 61 62 65 6c 20 3d 20 30 3b    int label = 0;
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9340: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
9350: 65 73 73 20 61 66 74 65 72 20 73 75 62 2d 73 65  ess after sub-se
9360: 6c 65 63 74 20 63 6f 64 65 20 2a 2f 0a 20 20 56  lect code */.  V
9370: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9380: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9390: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
93a0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  turn;..  /* If t
93b0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 76 61 72  his is not a var
93c0: 69 61 62 6c 65 20 28 63 6f 72 72 65 6c 61 74 65  iable (correlate
93d0: 64 29 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  d) select, then 
93e0: 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 69 74 20  execute.  ** it 
93f0: 6f 6e 6c 79 20 6f 6e 63 65 2e 20 55 6e 6c 65 73  only once. Unles
9400: 73 20 74 68 69 73 20 69 73 20 70 61 72 74 20 6f  s this is part o
9410: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
9420: 72 61 6d 2e 20 49 6e 0a 20 20 2a 2a 20 74 68 61  ram. In.  ** tha
9430: 74 20 63 61 73 65 20 72 65 2d 65 78 65 63 75 74  t case re-execut
9440: 65 20 65 76 65 72 79 20 74 69 6d 65 20 28 74 68  e every time (th
9450: 69 73 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69  is could be opti
9460: 6d 69 7a 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69  mized)..  */.  i
9470: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
9480: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9490: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
94a0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
94b0: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
94c0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
94d0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
94e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
94f0: 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a  mLoad, mem, 0);.
9500: 20 20 20 20 6c 61 62 65 6c 20 3d 20 73 71 6c 69      label = sqli
9510: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
9520: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
9530: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9540: 49 66 2c 20 30 2c 20 6c 61 62 65 6c 29 3b 0a 20  If, 0, label);. 
9550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9560: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9570: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 1, 0);.    sq
9580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9590: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d  , OP_MemStore, m
95a0: 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69  em, 1);.  }..  i
95b0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
95c0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
95d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
95e0: 41 67 67 43 6f 6e 74 65 78 74 50 75 73 68 2c 20  AggContextPush, 
95f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  0, 0);.  }..  sw
9600: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9610: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9620: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
9630: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
9640: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
9650: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9660: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
9670: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d  ss of OP_OpenTem
9680: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  p instruction */
9690: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
96a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
96b0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
96c0: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
96d0: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
96e0: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
96f0: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
9700: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
9710: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
9720: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
9730: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
9740: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9750: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
9760: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
9770: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
9780: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
9790: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
97a0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
97b0: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
97c0: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
97d0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
97e0: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
97f0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
9800: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
9810: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
9820: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
9830: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
9840: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
9850: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
9860: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
9870: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
9880: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
9890: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
98a0: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
98b0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
98c0: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
98d0: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
98e0: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
98f0: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
9900: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
9910: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
9920: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
9930: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
9940: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
9950: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
9960: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
9970: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
9980: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
9990: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
99a0: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
99b0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
99c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
99d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
99e0: 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  emp, pExpr->iTab
99f0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65  le, 0);.      me
9a00: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
9a10: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
9a20: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
9a30: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  o.nField = 1;.  
9a40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
9a60: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d  mColumns, pExpr-
9a70: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20  >iTable, 1);..  
9a80: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
9a90: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
9aa0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
9ab0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
9ac0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
9ad0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
9ae0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
9af0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
9b00: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
9b10: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
9b20: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
9b30: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
9b40: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
9b50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9b60: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70  int iParm = pExp
9b70: 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28  r->iTable +  (((
9b80: 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31  int)affinity)<<1
9b90: 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  6);.        Expr
9ba0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9bb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
9bc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
9bd0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
9be0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
9bf0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
9c00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9c10: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74  pSelect, SRT_Set
9c20: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
9c30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45  , 0);.        pE
9c40: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
9c50: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
9c60: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
9c70: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9c80: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
9c90: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
9ca0: 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70  [0] = binaryComp
9cb0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
9cc0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9ce0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
9cf0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
9d00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
9d10: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
9d20: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
9d30: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
9d40: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
9d50: 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20  **..** For each 
9d60: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
9d70: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
9d80: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
9d90: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
9da0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
9db0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
9dc0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
9dd0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
9de0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
9df0: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
9e00: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
9e10: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
9e20: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
9e30: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
9e40: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
9e50: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
9e60: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
9e70: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
9e80: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
9e90: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
9ea0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
9eb0: 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERIC;.        }.
9ec0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
9ed0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
9ee0: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
9ef0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
9f00: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
9f10: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
9f20: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
9f30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
9f40: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
9f50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
9f60: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
9f70: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
9f80: 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ].pExpr;..      
9f90: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
9fa0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9fb0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64   is constant and
9fc0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20   valid. */.     
9fd0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
9fe0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9ff0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
a000: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a010: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
a020: 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68 74            "right
a030: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
a040: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
a050: 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20  e constant");.  
a060: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a070: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
a090: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
a0a0: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
a0b0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
a0c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
a0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a0e0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b  de(pParse, pE2);
a0f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a100: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a110: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
a120: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
a130: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a150: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
a160: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a170: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a180: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 70 45  OP_PutStrKey, pE
a190: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a1a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a1d0: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
a1e0: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
a1f0: 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  FO);.      break
a200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
a210: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
a220: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
a230: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
a240: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
a250: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
a260: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
a270: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
a280: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
a290: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
a2a0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
a2b0: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
a2c0: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
a2d0: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
a2e0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
a2f0: 20 20 69 6e 74 20 73 6f 70 3b 0a 20 20 20 20 20    int sop;.     
a300: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 0a   Select *pSel;..
a310: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
a320: 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  lumn = pParse->n
a330: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65  Mem++;.      pSe
a340: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
a350: 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ct;.      if( pE
a360: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
a370: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f  CT ){.        so
a380: 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  p = SRT_Mem;.   
a390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
a3b0: 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22  oken one = { "1"
a3c0: 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20  , 0, 1 };.      
a3d0: 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73    sop = SRT_Exis
a3e0: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
a3f0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a400: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
a410: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  .        pSel->p
a420: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
a430: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
a440: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a450: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a460: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47  te3Expr(TK_INTEG
a470: 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 2c  ER, 0, 0, &one),
a480: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
a490: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a4a0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73  (pParse, pSel, s
a4b0: 6f 70 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  op, pExpr->iColu
a4c0: 6d 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  mn, 0, 0, 0, 0);
a4d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a4e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
a4f0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
a500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 43  AddOp(v, OP_AggC
a520: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
a530: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 61 62 65  ;.  }.  if( labe
a540: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
a550: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a560: 65 6c 28 76 2c 20 6c 61 62 65 6c 29 3b 0a 20 20  el(v, label);.  
a570: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  }.  return;.}.#e
a580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a590: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
a5a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a5b0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
a5c0: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
a5d0: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
a5e0: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
a5f0: 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74  ..n-1] on the st
a600: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
a610: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
a620: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
a630: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
a640: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73    int i;.  if( s
a650: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
a660: 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c  , &i) ){.    sql
a670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a680: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
a690: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
a6a0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
a6b0: 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71  its(z) ){.    sq
a6c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a6d0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
a6e0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  , z, n);.  }else
a6f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a700: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
a710: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
a720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a730: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
a740: 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
a750: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
a760: 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
a770: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65  on and leave the
a780: 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74   result on the t
a790: 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a  op of stack..**.
a7a0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
a7b0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
a7c0: 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
a7d0: 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
a7e0: 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
a7f0: 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
a800: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
a810: 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
a820: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
a830: 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
a840: 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
a850: 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
a860: 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
a870: 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
a880: 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
a890: 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
a8a0: 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
a8b0: 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
a8c0: 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
a8d0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
a8e0: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
a8f0: 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
a900: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
a910: 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
a920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
a930: 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
a940: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a950: 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20 76   int op;.  if( v
a960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a970: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
a980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a990: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a9a0: 67 38 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20 45  g8, 0, 0);  /* E
a9b0: 6d 70 74 79 20 65 78 70 72 65 73 73 69 6f 6e 20  mpty expression 
a9c0: 65 76 61 6c 73 20 74 6f 20 4e 55 4c 4c 20 2a 2f  evals to NULL */
a9d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
a9e0: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
a9f0: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
aa00: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
aa10: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
aa20: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  f( pParse->useAg
aa30: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
aa40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aa50: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
aa60: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
aa70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
aa80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
aa90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aaa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aab0: 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
aac0: 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
aad0: 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
aae0: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 20 20   NDEBUG.        
aaf0: 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  if( pExpr->span.
ab00: 7a 20 26 26 20 70 45 78 70 72 2d 3e 73 70 61 6e  z && pExpr->span
ab10: 2e 6e 3e 30 20 26 26 20 70 45 78 70 72 2d 3e 73  .n>0 && pExpr->s
ab20: 70 61 6e 2e 6e 3c 31 30 30 20 29 7b 0a 20 20 20  pan.n<100 ){.   
ab30: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
ab40: 6e 74 28 28 76 2c 20 22 23 20 25 54 22 2c 20 26  nt((v, "# %T", &
ab50: 70 45 78 70 72 2d 3e 73 70 61 6e 29 29 3b 0a 20  pExpr->span));. 
ab60: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
ab70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ab80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
aba0: 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  o, pExpr->iTable
abb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
abc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
abe0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
abf0: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78  deInteger(v, pEx
ac00: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
ac10: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
ac20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
ac40: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
ac50: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
ac60: 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54  assert( TK_FLOAT
ac70: 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20  ==OP_Real );.   
ac80: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54     assert( TK_ST
ac90: 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38  RING==OP_String8
aca0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acb0: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
acc0: 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  0, 0, pExpr->tok
acd0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
ace0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  en.n);.      sql
acf0: 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50  ite3VdbeDequoteP
ad00: 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  3(v, -1);.      
ad10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ad20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad30: 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
ad40: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
ad50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ad60: 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42  TK_BLOB==OP_HexB
ad70: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lob );.      sql
ad80: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
ad90: 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e  p, 0, 0, pExpr->
ada0: 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45 78 70 72  token.z+1, pExpr
adb0: 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b 0a 20 20  ->token.n-1);.  
adc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
add0: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
ade0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
adf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
ae00: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
ae10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
ae30: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
ae40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ae50: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
ae60: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
ae70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ae80: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
ae90: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
aea0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
aeb0: 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20  ->token.n>1 ){. 
aec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aed0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
aee0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
aef0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
af00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
af10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
af20: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
af30: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
af40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
af50: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
af60: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
af70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
af90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
afa0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
afb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
afc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
afd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
afe0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
aff0: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
b000: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b010: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
b020: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b030: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
b040: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
b050: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
b060: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
b070: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
b080: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
b090: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
b0a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b0b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b0c0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
b0d0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b0e0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
b0f0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
b100: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
b110: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
b120: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c  ->pRight, op, 0,
b130: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b150: 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
b160: 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
b170: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
b180: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
b190: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
b1a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
b1b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
b1c0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
b1d0: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
b1e0: 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
b1f0: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
b200: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
b210: 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
b220: 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
b230: 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
b240: 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
b250: 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
b260: 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
b270: 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
b280: 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
b290: 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
b2a0: 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
b2b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b2c0: 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
b2d0: 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
b2e0: 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
b2f0: 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
b300: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
b310: 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
b320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b330: 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
b340: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b350: 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
b360: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
b370: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
b380: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
b390: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
b3a0: 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
b3b0: 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
b3c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b3d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b3e0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
b3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b400: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b410: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
b420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b430: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
b440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b450: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
b460: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
b470: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
b480: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
b490: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
b4a0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
b4b0: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
b4c0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
b4d0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
b4e0: 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c    Token *p = &pL
b4f0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
b500: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
b510: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
b520: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
b530: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
b540: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
b550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
b560: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
b570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b580: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b590: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
b5a0: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
b5b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b5c0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
b5d0: 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  v, z, p->n+1);. 
b5e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b5f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
b600: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b620: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
b630: 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20  o TK_NOT */.    
b640: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
b650: 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
b660: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
b670: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
b680: 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
b690: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b6a0: 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
b6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b6c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b6d0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b6f0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
b700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b710: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b720: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
b730: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
b740: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
b750: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b760: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
b770: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
b780: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
b790: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
b7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b7b0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b7c0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
b7d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b7e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b7f0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
b800: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
b810: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
b820: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b830: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
b840: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
b850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b860: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
b870: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  -1, 0);.      br
b880: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b890: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
b8a0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ION: {.      sql
b8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b8c0: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
b8d0: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
b8e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b8f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44 41 54      case TK_CDAT
b900: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  E:.    case TK_C
b910: 54 49 4d 45 3a 0a 20 20 20 20 63 61 73 65 20 54  TIME:.    case T
b920: 4b 5f 43 54 49 4d 45 53 54 41 4d 50 3a 0a 20 20  K_CTIMESTAMP:.  
b930: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a    case TK_GLOB:.
b940: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
b950: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
b960: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
b970: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
b980: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
b990: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
b9a0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
b9b0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
b9c0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
b9d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a  .      int nId;.
b9e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b9f0: 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74   *zId;.      int
ba00: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69   p2 = 0;.      i
ba10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65  nt i;.      u8 e
ba20: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
ba30: 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  >enc;.      Coll
ba40: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
ba50: 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f        getFunctio
ba60: 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49  nName(pExpr, &zI
ba70: 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20  d, &nId);.      
ba80: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
ba90: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
baa0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
bab0: 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
bac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bad0: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
bae0: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
baf0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
bb00: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a  pParse, pList);.
bb10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb20: 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
bb30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
bb40: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
bb50: 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
bb60: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
bb70: 20 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31          p2 |= (1
bb80: 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
bb90: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
bba0: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
bbb0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
bbc0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
bbd0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
bbe0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
bbf0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
bc00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bc10: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
bc20: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
bc30: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
bc40: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
bc50: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
bc60: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
bc70: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
bc80: 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
bc90: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
bca0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
bcb0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
bcc0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  dbeOp3(v, OP_Fun
bcd0: 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32  ction, nExpr, p2
bce0: 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50  , (char*)pDef, P
bcf0: 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
bd00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
bd10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bd20: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
bd30: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
bd40: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
bd50: 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
bd60: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
bd70: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
bd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bd90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
bda0: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43  mLoad, pExpr->iC
bdb0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
bdc0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
bdd0: 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72   "# load subquer
bde0: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
bdf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
be00: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
be10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
be20: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
be30: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 73 71 6c  inity;.      sql
be40: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
be50: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
be60: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
be70: 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
be80: 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
be90: 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
bea0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
beb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
bec0: 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
bed0: 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
bee0: 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
bef0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
bf00: 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P3 of OP_MakeRe
bf10: 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
bf20: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
bf30: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
bf40: 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  ty(pExpr);..    
bf50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf60: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
bf70: 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 1, 0);..      
bf80: 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
bf90: 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
bfa0: 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
bfb0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
bfc0: 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
bfd0: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
bfe0: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
bff0: 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
c000: 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
c010: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c020: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c030: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c040: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c050: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c060: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c070: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c080: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
c090: 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20  dr+4);          
c0a0: 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f    /* addr + 0 */
c0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c0c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c0d0: 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 2, 0);.      
c0e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c0f0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
c100: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
c110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c120: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
c130: 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+7);.      sqli
c140: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c150: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
c160: 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
c170: 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20  ;   /* addr + 4 
c180: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c190: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1a0: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
c1b0: 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20  able, addr+7);. 
c1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
c1e0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20  mm, -1, 0);     
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c200: 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20  addr + 6 */..   
c210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c220: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
c230: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
c240: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c250: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c260: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
c270: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
c280: 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
c290: 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
c2a0: 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
c2b0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
c2c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c2d0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
c2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c2f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
c300: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
c310: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c320: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
c330: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
c340: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
c350: 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20   pRight, OP_Ge, 
c360: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
c370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c380: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
c390: 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
c3a0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
c3b0: 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
c3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c3d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
c3e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
c3f0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
c400: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
c410: 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Le, 0, 0);.   
c420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c430: 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30  dOp(v, OP_And, 0
c440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
c450: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c460: 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20  e TK_UPLUS:.    
c470: 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
c480: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c490: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c4a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c4c0: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
c4d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
c4e0: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
c4f0: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
c500: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c510: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
c520: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
c530: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
c540: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
c550: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c560: 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20   *aListelem;..  
c570: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
c580: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
c590: 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
c5a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
c5b0: 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
c5c0: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
c5d0: 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
c5e0: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
c5f0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
c600: 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
c610: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
c620: 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
c630: 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
c640: 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c  _end_label = sql
c650: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c660: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
c670: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
c680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c690: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c6a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
c6c0: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
c6d0: 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
c6e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c6f0: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
c700: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
c710: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c720: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
c730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c740: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c  Op(v, OP_Dup, 1,
c750: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
c760: 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f  umpInst = codeCo
c770: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
c780: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73  xpr->pLeft, aLis
c790: 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a  telem[i].pExpr,.
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20   OP_Ne, 0, 1);. 
c7d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c7e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7f0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
c800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c810: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
c820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c830: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
c840: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
c850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c860: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
c870: 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
c880: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
c890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c8a0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78  , OP_Goto, 0, ex
c8b0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
c8c0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
c8d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
c8e0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
c8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c900: 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74  geP2(v, jumpInst
c910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
c920: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
c930: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
c940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c950: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
c960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c970: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c980: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
c990: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c9b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
c9c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c9e0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
c9f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ca00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ca10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
ca20: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
ca30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca40: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ca50: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
ca60: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
ca70: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
ca80: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
ca90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
caa0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cab0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cac0: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
cad0: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
cae0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
caf0: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
cb00: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
cb10: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
cb20: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
cb30: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
cb40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
cb50: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
cb60: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
cb70: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
cb80: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
cb90: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
cba0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
cbb0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
cbc0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
cbd0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cbe0: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
cbf0: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
cc00: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
cc30: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
cc40: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  .n);.         sq
cc50: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
cc60: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
cc70: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
cc80: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
cc90: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
cca0: 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20  Ignore );.      
ccb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ccc0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  dOp(v, OP_Contex
ccd0: 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
cce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ccf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
cd00: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
cd10: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
cd20: 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56  ump);.         V
cd30: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cd40: 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22  # raise(IGNORE)"
cd50: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
cd60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
cd70: 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ak;.  }.}..#ifnd
cd80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cd90: 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e  RIGGER./*.** Gen
cda0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
cdb0: 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
cdc0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
cdd0: 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65 73  d leaves the res
cde0: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  ult.** on the st
cdf0: 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73  ack.  See also s
ce00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
ce10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ce20: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
ce30: 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c 74  cache the result
ce40: 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
ce50: 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f  pExpr tree.** so
ce60: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61   that it will ma
ce70: 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63 61  ke use of the ca
ce80: 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73  ched result on s
ce90: 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61  ubsequent evalua
cea0: 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20  tions.** rather 
ceb0: 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68  than evaluate th
cec0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
ced0: 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69  on again.  Trivi
cee0: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  al expressions a
cef0: 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64  re.** not cached
cf00: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
cf10: 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20  sion is cached, 
cf20: 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73 74  its result is st
cf30: 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65  ored in a .** me
cf40: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
cf50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cf60: 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
cf70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
cf80: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
cf90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
cfa0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
cfb0: 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  m;.  int addr1, 
cfc0: 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d  addr2;.  if( v==
cfd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64  0 ) return;.  ad
cfe0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
cff0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d000: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
d010: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
d020: 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c  );.  addr2 = sql
d030: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d040: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64  ddr(v);.  if( ad
d050: 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73  dr2>addr1+1 || s
d060: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
d070: 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64  v, addr1)->opcod
d080: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
d090: 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78  {.    iMem = pEx
d0a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
d0b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
d0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0d0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
d0e0: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
d0f0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
d100: 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23  EGISTER;.  }.}.#
d110: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d120: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
d130: 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
d140: 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
d150: 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
d160: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
d170: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
d180: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
d190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
d1a0: 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74  ments pushed ont
d1b0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  o the stack..*/.
d1c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
d1d0: 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
d1e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d1f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d200: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d210: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20  st *pList    /* 
d220: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
d230: 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
d240: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
d250: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d260: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
d270: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66  .  Vdbe *v;.  if
d280: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
d290: 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c  urn 0;.  v = sql
d2a0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d2b0: 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  se);.  n = pList
d2c0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
d2d0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
d2e0: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
d2f0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
d300: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d310: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
d320: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d330: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
d340: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
d350: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
d360: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
d370: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
d380: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
d390: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
d3a0: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
d3b0: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
d3c0: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
d3d0: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
d3e0: 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
d3f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
d400: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
d410: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
d420: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
d430: 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
d440: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
d450: 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
d460: 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
d470: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
d480: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
d490: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
d4a0: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
d4b0: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
d4c0: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
d4d0: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
d4e0: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
d4f0: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
d500: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
d510: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
d520: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
d530: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
d540: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
d550: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
d560: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
d570: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
d580: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
d590: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
d5a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
d5b0: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
d5c0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
d5d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d5e0: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
d5f0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d600: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
d610: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
d620: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d630: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
d640: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
d650: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
d660: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
d670: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
d680: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
d690: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
d6a0: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
d6b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d6c0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
d6d0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
d6e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d6f0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
d700: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
d710: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
d720: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
d730: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
d740: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
d750: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d760: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
d770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d780: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
d790: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d7a0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
d7b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d7c0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
d7d0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
d7e0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
d7f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
d800: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
d810: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
d820: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d830: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
d840: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
d850: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
d860: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
d870: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
d880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d890: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
d8a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
d8b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
d8c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
d8d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
d8e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
d8f0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
d900: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
d910: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d920: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
d930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d940: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
d950: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
d960: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
d970: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
d980: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
d990: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
d9a0: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
d9b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d9c0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d9d0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
d9e0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d9f0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
da00: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
da10: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
da20: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
da30: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
da40: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
da50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
da60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
da70: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
da80: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
da90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
daa0: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
dab0: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
dac0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
dad0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
dae0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
daf0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
db00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
db10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db20: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
db30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
db40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
db50: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
db60: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
db70: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
db80: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
db90: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
dba0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
dbb0: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
dbc0: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
dbd0: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
dbe0: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
dbf0: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
dc00: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
dc10: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
dc20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
dc30: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
dc40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
dc50: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
dc60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
dc70: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
dc80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dc90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dca0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
dcb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dcc0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
dcd0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
dce0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
dcf0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
dd00: 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
dd10: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
dd20: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
dd30: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
dd40: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
dd50: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
dd60: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
dd70: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
dd80: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
dd90: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
dda0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
ddb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ddc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ddd0: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
dde0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ddf0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
de00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
de10: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
de20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de30: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
de40: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
de50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
de60: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
de70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
de80: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
de90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dea0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
deb0: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
dec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ded0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
dee0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
def0: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
df00: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
df10: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
df20: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
df30: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
df40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
df50: 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
df60: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
df70: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
df80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
df90: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
dfa0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
dfb0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
dfc0: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
dfd0: 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
dfe0: 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
dff0: 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20  Null is true or 
e000: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
e010: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61  jumpIfNull is fa
e020: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
e030: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e040: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
e050: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e060: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
e070: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
e080: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e090: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
e0a0: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
e0b0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
e0c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
e0d0: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
e0e0: 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
e0f0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
e100: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
e110: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
e120: 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
e130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
e140: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
e150: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
e160: 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
e170: 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
e180: 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
e190: 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
e1a0: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e1c0: 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
e1d0: 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
e1e0: 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
e1f0: 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
e200: 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
e210: 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
e220: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
e230: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e250: 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
e260: 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
e270: 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
e280: 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
e290: 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
e2a0: 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
e2b0: 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
e2c0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
e2d0: 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
e2e0: 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
e2f0: 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
e300: 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
e310: 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
e320: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
e330: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
e340: 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
e350: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
e360: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
e370: 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
e380: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
e390: 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
e3a0: 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
e3b0: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
e3c0: 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
e3d0: 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
e3e0: 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
e3f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e400: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
e410: 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
e420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e430: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
e440: 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
e450: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
e460: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
e470: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
e480: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e490: 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
e4a0: 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
e4b0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e4c0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
e4d0: 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
e4e0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
e4f0: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
e500: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e510: 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
e520: 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
e530: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e540: 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
e550: 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
e560: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e570: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
e580: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
e590: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
e5a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e5b0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e5c0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e5d0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
e5e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e5f0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e600: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
e610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e620: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
e630: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
e640: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e650: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
e660: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e670: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e680: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
e690: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e6a0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
e6b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e6c0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e6d0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
e6e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e6f0: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
e700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
e720: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e730: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
e740: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e750: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e760: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
e770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e780: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
e790: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
e7a0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
e7b0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
e7c0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
e7d0: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
e7e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e7f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e800: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
e810: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e820: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
e830: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
e840: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e850: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
e860: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
e870: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
e880: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e890: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e8a0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
e8b0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
e8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e8d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e8e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e900: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
e910: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
e920: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e930: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
e940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
e950: 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45  ression is "x BE
e960: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20  TWEEN y AND z". 
e970: 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  It is implemente
e980: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
e990: 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
e9a0: 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20  >= y) GOTO 3.   
e9b0: 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65     ** 2 GOTO <de
e9c0: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49  st>.      ** 3 I
e9d0: 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c  F (x > z) GOTO <
e9e0: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20  dest>.      */. 
e9f0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
ea00: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
ea10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
ea20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
ea30: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
ea40: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
ea50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ea60: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
ea70: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
ea80: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ea90: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
eaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
eab0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
eac0: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  ght);.      addr
ead0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
eae0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
eaf0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
eb00: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
eb10: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64  Right, OP_Ge, ad
eb20: 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  dr+3, !jumpIfNul
eb30: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
eb40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eb50: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
eb60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eb70: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
eb80: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
eb90: 20 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 31 5d 2e 70 45 78  >pList->a[1].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 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
ebe0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ebf0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
ec00: 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c  ht, OP_Gt, dest,
ec10: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ec20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ec30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
ec40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ec50: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ec60: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
ec70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ec80: 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66  OP_IfNot, jumpIf
ec90: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
eca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ecb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20    }.}../*.** Do 
ecc0: 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
ecd0: 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
ece0: 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
ecf0: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
ed00: 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
ed10: 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
ed20: 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
ed30: 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
ed40: 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ny way..*/.int s
ed50: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
ed60: 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
ed70: 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
ed80: 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20    if( pA==0 ){. 
ed90: 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b     return pB==0;
eda0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d  .  }else if( pB=
edb0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
edc0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
edd0: 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
ede0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
edf0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ee00: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
ee10: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
ee20: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
ee30: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
ee40: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
ee50: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
ee60: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
ee70: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
ee80: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
ee90: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
eea0: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
eeb0: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
eec0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
eed0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
eee0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
eef0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ef00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ef10: 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
ef20: 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
ef30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ef50: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
ef60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ef70: 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
ef80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ef90: 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
efa0: 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
efb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
efc0: 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
efd0: 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
efe0: 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
eff0: 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
f000: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
f010: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
f020: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
f030: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
f040: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
f050: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
f060: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
f070: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41  lite3StrNICmp(pA
f080: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
f090: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
f0a0: 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  n.n)!=0 ) return
f0b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f0c0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
f0d0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
f0e0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
f0f0: 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72  gg[] array and r
f100: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
f110: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65 6d  .** The new elem
f120: 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
f130: 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  ed to zero.  The
f140: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
f150: 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65 64  n is.** expected
f160: 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
f170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
f180: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
f190: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
f1a0: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
f1b0: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
f1c0: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
f1d0: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
f1e0: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
f1f0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
f200: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
f210: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
f220: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
f230: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
f240: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
f250: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
f260: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
f270: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
f280: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
f290: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
f2a0: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
f2b0: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
f2c0: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
f2d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
f2e0: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
f2f0: 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
f300: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
f310: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
f320: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
f330: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
f340: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
f350: 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
f360: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
f370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f380: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
f390: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
f3a0: 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
f3b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
f3c0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
f3d0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
f3e0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
f3f0: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
f400: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
f410: 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72 67  e = (Parse*)pArg
f420: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
f430: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
f440: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
f450: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
f460: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
f470: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
f480: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
f490: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
f4a0: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
f4b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
f4c0: 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  ( aAgg[i].pExpr-
f4d0: 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
f4e0: 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
f4f0: 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  && aAgg[i].pExpr
f500: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
f510: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
f520: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f540: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
f550: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
f560: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
f570: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
f580: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
f590: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
f5a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
f5b0: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20  [i].isAgg = 0;. 
f5c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
f5d0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
f5e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
f5f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
f600: 3d 20 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = i;.      retur
f610: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f620: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
f630: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  ION: {.      aAg
f640: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
f650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f660: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
f670: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f680: 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67  f( !aAgg[i].isAg
f690: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
f6a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f6b0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  3ExprCompare(aAg
f6c0: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
f6d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
f6e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f6f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f700: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
f710: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  gg ){.        u8
f720: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
f730: 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  b->enc;.        
f740: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
f750: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
f760: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
f770: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
f780: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
f790: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
f7a0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
f7b0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
f7c0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
f7d0: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
f7e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
f7f0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
f800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45  .             pE
f810: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
f820: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
f830: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
f840: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
f850: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
f860: 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
f870: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
f880: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
f890: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
f8a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
f8c0: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
f8d0: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
f8e0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
f8f0: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
f900: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
f910: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
f920: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
f930: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
f940: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
f950: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
f960: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
f970: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
f980: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
f990: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
f9a0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
f9b0: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
f9c0: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
f9d0: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
f9e0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
f9f0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
fa00: 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
fa10: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
fa20: 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
fa30: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
fa40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
fa50: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
fa60: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
fa70: 67 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a  gregates(Parse *
fa80: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
fa90: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  xpr){.  int nErr
faa0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b   = pParse->nErr;
fab0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
fac0: 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
fad0: 67 72 65 67 61 74 65 2c 20 70 50 61 72 73 65 29  gregate, pParse)
fae0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
faf0: 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a  e->nErr - nErr;.
fb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
fb10: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  a user function 
fb20: 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20 61 20  given a name, a 
fb30: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
fb40: 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67 0a 2a  nts and a flag.*
fb50: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65  * indicating whe
fb60: 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
fb70: 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36  n prefers UTF-16
fb80: 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20 52 65   over UTF-8.  Re
fb90: 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
fba0: 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66  r to the FuncDef
fbb0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
fbc0: 64 65 66 69 6e 65 73 20 74 68 61 74 20 66 75 6e  defines that fun
fbd0: 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e  ction, or return
fbe0: 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  .** NULL if the 
fbf0: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
fc00: 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  t exist..**.** I
fc10: 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67  f the createFlag
fc20: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
fc30: 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62  e, then a new (b
fc40: 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a  lank) FuncDef.**
fc50: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
fc60: 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20  eated and liked 
fc70: 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73 74  into the "db" st
fc80: 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20  ructure if a.** 
fc90: 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63  no matching func
fca0: 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
fcb0: 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63  existed.  When c
fcc0: 72 65 61 74 65 46 6c 61 67 20 69 73 20 74 72 75  reateFlag is tru
fcd0: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72  e.** and the nAr
fce0: 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d  g parameter is -
fcf0: 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66  1, then only a f
fd00: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63  unction that acc
fd10: 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62  epts.** any numb
fd20: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
fd30: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
fd40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74  ..**.** If creat
fd50: 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61  eFlag is false a
fd60: 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74  nd nArg is -1, t
fd70: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 76 61  hen the first va
fd80: 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  lid.** function 
fd90: 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65  found is returne
fda0: 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69  d.  A function i
fdb0: 73 20 76 61 6c 69 64 20 69 66 20 65 69 74 68 65  s valid if eithe
fdc0: 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53  r xFunc.** or xS
fdd0: 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  tep is non-zero.
fde0: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65  .**.** If create
fdf0: 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 20 74  Flag is false, t
fe00: 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  hen a function w
fe10: 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65 64  ith the required
fe20: 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e 75 6d   name and.** num
fe30: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
fe40: 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65 64   may be returned
fe50: 20 65 76 65 6e 20 69 66 20 74 68 65 20 65 54 65   even if the eTe
fe60: 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65 73 20  xtRep flag does 
fe70: 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 61  not.** match tha
fe80: 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a 2f 0a  t requested..*/.
fe90: 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65 33  FuncDef *sqlite3
fea0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  FindFunction(.  
feb0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
fec0: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
fed0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
fee0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f  t char *zName, /
fef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
ff00: 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c  nction.  Not nul
ff10: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a  l-terminated */.
ff20: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20    int nName,    
ff30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ff40: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
ff50: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  the name */.  in
ff60: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
ff70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ff80: 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61  guments.  -1 mea
ff90: 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f  ns any number */
ffa0: 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20  .  u8 enc,      
ffb0: 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65 72 72        /* Preferr
ffc0: 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  ed text encoding
ffd0: 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65   */.  int create
ffe0: 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61  Flag     /* Crea
fff0: 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20  te new entry if 
10000 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  true and does no
10010 74 20 6f 74 68 65 72 77 69 73 65 20 65 78 69 73  t otherwise exis
10020 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65  t */.){.  FuncDe
10030 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  f *p;         /*
10040 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
10050 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20  le */.  FuncDef 
10060 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  *pFirst;    /* F
10070 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 77 69  irst function wi
10080 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a 2f 0a  th this name */.
10090 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65 73 74    FuncDef *pBest
100a0 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20 6d 61   = 0; /* Best ma
100b0 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  tch found so far
100c0 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 6d 61   */.  int bestma
100d0 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20 20 61  tch = 0;  ...  a
100e0 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51 4c 49  ssert( enc==SQLI
100f0 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 3d 3d  TE_UTF8 || enc==
10100 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
10110 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  | enc==SQLITE_UT
10120 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 6e  F16BE );.  if( n
10130 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20 3d 20  Arg<-1 ) nArg = 
10140 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20 3d 20  -1;..  pFirst = 
10150 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65  (FuncDef*)sqlite
10160 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
10170 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Func, zName, nNa
10180 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 46 69  me);.  for(p=pFi
10190 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  rst; p; p=p->pNe
101a0 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75 72 69  xt){.    /* Duri
101b0 6e 67 20 74 68 65 20 73 65 61 72 63 68 20 66 6f  ng the search fo
101c0 72 20 74 68 65 20 62 65 73 74 20 66 75 6e 63 74  r the best funct
101d0 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  ion definition, 
101e0 62 65 73 74 6d 61 74 63 68 20 69 73 20 73 65 74  bestmatch is set
101f0 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c 6c 6f  .    ** as follo
10200 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ws to indicate t
10210 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
10220 65 20 6d 61 74 63 68 20 77 69 74 68 20 74 68 65  e match with the
10230 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20 20 20   definition.    
10240 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
10250 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a 0a 20   pBest:.    **. 
10260 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74 20 69     ** 0: pBest i
10270 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74 63 68  s NULL. No match
10280 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2e   has been found.
10290 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76 61 72  .    ** 1: A var
102a0 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
102b0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 70 72  function that pr
102c0 65 66 65 72 73 20 55 54 46 2d 38 20 77 68 65 6e  efers UTF-8 when
102d0 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a   a UTF-16.    **
102e0 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69 73 20      encoding is 
102f0 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
10300 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
10310 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   2: A variable a
10320 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
10330 6e 20 74 68 61 74 20 75 73 65 73 20 55 54 46 2d  n that uses UTF-
10340 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d 31 36  16BE when UTF-16
10350 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  LE is.    **    
10360 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
10370 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
10380 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   3: A variable a
10390 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
103a0 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  n using the same
103b0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 0a   text encoding..
103c0 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75 6e 63      ** 4: A func
103d0 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65 78  tion with the ex
103e0 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  act number of ar
103f0 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73 74 65  guments requeste
10400 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20  d that.    **   
10410 20 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77   prefers UTF-8 w
10420 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 6e 63  hen a UTF-16 enc
10430 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74  oding is request
10440 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
10450 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41 20 66  a..    ** 5: A f
10460 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
10470 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66   exact number of
10480 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65   arguments reque
10490 73 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a  sted that.    **
104a0 20 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d      prefers UTF-
104b0 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d 31 36  16LE when UTF-16
104c0 42 45 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  BE is requested,
104d0 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
104e0 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65 78 61      ** 6: An exa
104f0 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2a  ct match..    **
10500 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67 65 72  .    ** A larger
10510 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74 63 68   value of 'match
10520 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65 73 20  qual' indicates 
10530 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62 6c 65  a more desirable
10540 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f 0a 20   match..    */. 
10550 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d     if( p->nArg==
10560 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d 3d 6e  -1 || p->nArg==n
10570 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20  Arg || nArg==-1 
10580 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 74  ){.      int mat
10590 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ch = 1;         
105a0 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66 20 74   /* Quality of t
105b0 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  his match */.   
105c0 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d     if( p->nArg==
105d0 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31  nArg || nArg==-1
105e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
105f0 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 4;.      }. 
10600 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d 70 2d       if( enc==p-
10610 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20 20 20  >iPrefEnc ){.   
10620 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 32 3b       match += 2;
10630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
10640 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d 53 51  lse if( (enc==SQ
10650 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26 26 20  LITE_UTF16LE && 
10660 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c  p->iPrefEnc==SQL
10670 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c 7c 0a  ITE_UTF16BE) ||.
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10690 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
106a0 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45  6BE && p->iPrefE
106b0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
106c0 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  LE) ){.        m
106d0 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20 20 20  atch += 1;.     
106e0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 61   }..      if( ma
106f0 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20 29 7b  tch>bestmatch ){
10700 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d  .        pBest =
10710 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74   p;.        best
10720 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b 0a 20  match = match;. 
10730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10740 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 72  ..  /* If the cr
10750 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d 65 74  eateFlag paramet
10760 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  er is true, and 
10770 74 68 65 20 73 65 61 63 68 20 64 69 64 20 6e 6f  the seach did no
10780 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20 2a 2a  t reveal an.  **
10790 20 65 78 61 63 74 20 6d 61 74 63 68 20 66 6f 72   exact match for
107a0 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d 62 65   the name, numbe
107b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
107c0 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  nd encoding, the
107d0 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e 65 77  n add a.  ** new
107e0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 68 61   entry to the ha
107f0 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74  sh table and ret
10800 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  urn it..  */.  i
10810 66 28 20 63 72 65 61 74 65 46 6c 61 67 20 26 26  f( createFlag &&
10820 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26 26 20   bestmatch<6 && 
10830 0a 20 20 20 20 20 20 28 70 42 65 73 74 20 3d 20  .      (pBest = 
10840 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
10850 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e 61 6d  eof(*pBest)+nNam
10860 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70 42 65  e+1)) ){.    pBe
10870 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b  st->nArg = nArg;
10880 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e 65 78  .    pBest->pNex
10890 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
108a0 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d 20 28  pBest->zName = (
108b0 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31 5d 3b  char*)&pBest[1];
108c0 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50 72 65  .    pBest->iPre
108d0 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20  fEnc = enc;.    
108e0 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e  memcpy(pBest->zN
108f0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
10900 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a  e);.    pBest->z
10910 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
10920 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 3d 3d  .    if( pBest==
10930 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
10940 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65  t(&db->aFunc,pBe
10950 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c  st->zName,nName,
10960 28 76 6f 69 64 2a 29 70 42 65 73 74 29 20 29 7b  (void*)pBest) ){
10970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
10980 65 28 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pBest);.      
10990 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
109a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74    }..  if( pBest
109b0 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65   && (pBest->xSte
109c0 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e  p || pBest->xFun
109d0 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29  c || createFlag)
109e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
109f0 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Best;.  }.  retu
10a00 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.