/ Hex Artifact Content
Login

Artifact bf7253cd2d828ec8bf321321c2598e4b8918d79b:


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 37 20 32 30 30 35 2f 30 33 2f 32 31 20  .197 2005/03/21 
0220: 30 33 3a 35 33 3a 33 38 20 64 61 6e 69 65 6c 6b  03:53:38 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
04c0: 4b 5f 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75  K_AS ){.    retu
04d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
04e0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
04f0: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
0500: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0570: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0590: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
05a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
05b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
05c0: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
05d0: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
05e0: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
05f0: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0600: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0610: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0620: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
0630: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
0640: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
0650: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
0660: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
0670: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
0680: 3e 6f 70 3d 3d 54 4b 5f 41 53 20 26 26 20 21 70  >op==TK_AS && !p
0690: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
06a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
06b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
06c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
06d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
06e0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
06f0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0700: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0710: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0720: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0730: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0740: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0750: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0760: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0770: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0780: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0790: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
07a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
07b0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
07c0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
07d0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
07e0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
07f0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0800: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0810: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0820: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0830: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0840: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0850: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0860: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0870: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0880: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0890: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
08a0: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
08b0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
08c0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
08d0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
08e0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
08f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0900: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0910: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
0920: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0930: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0940: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
0950: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
0960: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
0970: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0980: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0990: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
09a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
09b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
09c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
09d0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
09e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
09f0: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a00: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a10: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0a30: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0a40: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0a50: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0a60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0a70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0a80: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0a90: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0aa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0ab0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0ac0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0ad0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0ae0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0af0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b00: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b10: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0b20: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0b30: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0b40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0b50: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0b60: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0b70: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0b80: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0b90: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0ba0: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0bb0: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0bc0: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0bd0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0bf0: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0c10: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0c20: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0c30: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0c40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0c50: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0c60: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0c70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0c80: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0c90: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0ca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0cb0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0cd0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0ce0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0cf0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0d00: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0d10: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0d20: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0d30: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0d40: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0d50: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0d60: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0d70: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0d80: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0d90: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0da0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0db0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0dc0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0dd0: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
0de0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  aff;.}../*.** pE
0df0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0e00: 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  son expression, 
0e10: 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e  eg. '=', '<', IN
0e20: 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64  (...) etc..** id
0e30: 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68  x_affinity is th
0e40: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e  e affinity of an
0e50: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e   indexed column.
0e60: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
0e70: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  if the index wit
0e80: 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61  h affinity idx_a
0e90: 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75  ffinity may be u
0ea0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0eb0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
0ec0: 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  on in pExpr..*/.
0ed0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0ee0: 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20  AffinityOk(Expr 
0ef0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78  *pExpr, char idx
0f00: 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68  _affinity){.  ch
0f10: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
0f20: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
0f30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20  r);.  return .  
0f40: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
0f50: 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20  FF_NONE) ||.    
0f60: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0f70: 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f  _NUMERIC && idx_
0f80: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
0f90: 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c  _AFF_INTEGER) ||
0fa0: 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54  .    (aff==SQLIT
0fb0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26  E_AFF_INTEGER &&
0fc0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
0fd0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0fe0: 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d  C) ||.    (aff==
0ff0: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
1000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1010: 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74  he P1 value that
1020: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1030: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1040: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1050: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1060: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1070: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1080: 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a   pExpr2..** If j
1090: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
10a0: 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  e, then set the 
10b0: 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20  low byte of the 
10c0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76  returned.** P1 v
10d0: 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65  alue to tell the
10e0: 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20   opcode to jump 
10f0: 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  if either expres
1100: 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  sion.** evaluate
1110: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  s to NULL..*/.st
1120: 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43  atic int binaryC
1130: 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70  ompareP1(Expr *p
1140: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
1150: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
1160: 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ull){.  char aff
1170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1180: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1190: 20 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29    return (((int)
11a0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
11b0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
11c0: 66 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66  ff))<<8)+(jumpIf
11d0: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Null?1:0);.}../*
11e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
11f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1200: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1210: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1220: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1230: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1240: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1250: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1270: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1280: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1290: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
12a0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
12b0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
12c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
12d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
12e0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
12f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1300: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1310: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1320: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1330: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1340: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
1350: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
1360: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1380: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1390: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
13a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
13b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13c0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
13d0: 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29  ;.  if( !pColl )
13e0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
13f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1400: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1420: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1430: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1440: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1450: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
1460: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
1470: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1480: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
1490: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
14a0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
14b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
14c0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
14d0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
14e0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
14f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1500: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1510: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
1520: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
1530: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
1540: 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1550: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1560: 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e  f true.  */.  in
1570: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1580: 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70  /* If true, jump
1590: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
15a0: 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  nd is NULL */.){
15b0: 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61  .  int p1 = bina
15c0: 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66  ryCompareP1(pLef
15d0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
15e0: 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65  fNull);.  CollSe
15f0: 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f  q *p3 = binaryCo
1600: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1610: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1620: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ht);.  return sq
1630: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50 61  lite3VdbeOp3(pPa
1640: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
1650: 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76  de, p1, dest, (v
1660: 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c  oid*)p3, P3_COLL
1670: 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  SEQ);.}../*.** C
1680: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1690: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
16a0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
16b0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
16c0: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
16d0: 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ode is obtained 
16e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
16f0: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
1700: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
1710: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1720: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
1730: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
1740: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a   gets freed..*/.
1750: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1760: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
1770: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1780: 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  ght, const Token
1790: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
17a0: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
17b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17c0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
17d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17e0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
17f0: 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74  loc fails, delet
1800: 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  e pLeft and pRig
1810: 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20  ht. Expressions 
1820: 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a  passed to .    *
1830: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1840: 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61  must always be a
1850: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71  llocated with sq
1860: 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20  lite3Expr() for 
1870: 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61  this .    ** rea
1880: 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  son. .    */.   
1890: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18a0: 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  te(pLeft);.    s
18b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18c0: 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65  (pRight);.    re
18d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
18e0: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
18f0: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1900: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1910: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70  ht = pRight;.  p
1920: 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a  New->iAgg = -1;.
1930: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
1940: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1950: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1960: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
1970: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
1980: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oken;.  }else if
1990: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
19a0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
19b0: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
19c0: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
19d0: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d  ight->span);.  }
19e0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
19f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f  }../*.** When do
1a00: 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72  ing a nested par
1a10: 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c  se, you can incl
1a20: 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ude terms in an 
1a30: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68  expression.** th
1a40: 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69  at look like thi
1a50: 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e  s:   #0 #1 #2 ..
1a60: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72  .  These terms r
1a70: 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73  efer to elements
1a80: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
1a90: 2e 20 20 22 23 30 22 20 28 6f 72 20 6a 75 73 74  .  "#0" (or just
1aa0: 20 22 23 22 29 20 6d 65 61 6e 73 20 74 68 65 20   "#") means the 
1ab0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
1ac0: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
1ad0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
1ae0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
1af0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 23 2d 31 20   so forth.  #-1 
1b00: 6d 65 61 6e 73 0a 2a 2a 20 6d 65 6d 6f 72 79 20  means.** memory 
1b10: 6c 6f 63 61 74 69 6f 6e 20 30 2e 20 20 23 2d 32  location 0.  #-2
1b20: 20 6d 65 61 6e 73 20 6d 65 6d 6f 72 79 20 6c 6f   means memory lo
1b30: 63 61 74 69 6f 6e 20 31 2e 20 20 41 6e 64 20 73  cation 1.  And s
1b40: 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  o forth..**.** T
1b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1b60: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1b70: 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ser to deal with
1b80: 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72   on of those ter
1b90: 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69  ms..** It immedi
1ba0: 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20  ately generates 
1bb0: 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68  code to store th
1bc0: 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d  e value in a mem
1bd0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ory location..**
1be0: 20 54 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20   The returns an 
1bf0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
1c00: 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74  will code to ext
1c10: 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 66  ract the value f
1c20: 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f  rom.** that memo
1c30: 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e  ry location as n
1c40: 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  eeded..*/.Expr *
1c50: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45  sqlite3RegisterE
1c60: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
1c70: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
1c80: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1c90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ca0: 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64  Expr *p;.  int d
1cb0: 65 70 74 68 3b 0a 20 20 69 66 28 20 76 3d 3d 30  epth;.  if( v==0
1cc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1cd0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
1ce0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
1cf0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d00: 73 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22  se, "near \"%T\"
1d10: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c  : syntax error",
1d20: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65   pToken);.    re
1d30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 20  turn 0;.  }.  p 
1d40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1d50: 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c  _REGISTER, 0, 0,
1d60: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
1d70: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  p==0 ){.    retu
1d80: 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 0;  /* Malloc
1d90: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1da0: 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28 26 70   depth = atoi(&p
1db0: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
1dc0: 69 66 28 20 64 65 70 74 68 3e 3d 30 20 29 7b 0a  if( depth>=0 ){.
1dd0: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
1de0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
1df0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e00: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
1e10: 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 20 20 73  depth, 0);.    s
1e20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1e30: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
1e40: 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20  p->iTable, 1);. 
1e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69   }else{.    p->i
1e60: 54 61 62 6c 65 20 3d 20 2d 31 2d 64 65 70 74 68  Table = -1-depth
1e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20  ;.}../*.** Join 
1e90: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20  two expressions 
1ea0: 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65  using an AND ope
1eb0: 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65  rator.  If eithe
1ec0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  r expression is.
1ed0: 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75  ** NULL, then ju
1ee0: 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74  st return the ot
1ef0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  her expression..
1f00: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
1f10: 45 78 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c  ExprAnd(Expr *pL
1f20: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1f30: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
1f40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f50: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
1f60: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
1f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
1f80: 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ft;.  }else{.   
1f90: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
1fa0: 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66  xpr(TK_AND, pLef
1fb0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
1fc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
1fd0: 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69  the Expr.span fi
1fe0: 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eld of the given
1ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73   expression to s
2000: 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20  pan all.** text 
2010: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
2020: 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  given tokens..*/
2030: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2040: 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70  rSpan(Expr *pExp
2050: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c  r, Token *pLeft,
2060: 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b   Token *pRight){
2070: 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68  .  assert( pRigh
2080: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
2090: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
20a0: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c  if( !sqlite3_mal
20b0: 6c 6f 63 5f 66 61 69 6c 65 64 20 26 26 20 70 52  loc_failed && pR
20c0: 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74  ight->z && pLeft
20d0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ->z ){.    asser
20e0: 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  t( pLeft->dyn==0
20f0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65   || pLeft->z[pLe
2100: 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20  ft->n]==0 );.   
2110: 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d   if( pLeft->dyn=
2120: 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79  =0 && pRight->dy
2130: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  n==0 ){.      pE
2140: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c  xpr->span.z = pL
2150: 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45  eft->z;.      pE
2160: 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52  xpr->span.n = pR
2170: 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  ight->n + Addr(p
2180: 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72  Right->z) - Addr
2190: 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20  (pLeft->z);.    
21a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
21b0: 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  pr->span.z = 0;.
21c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
21d0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
21e0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
21f0: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
2200: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
2210: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
2220: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2230: 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c  prFunction(ExprL
2240: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
2250: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
2260: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
2270: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
2280: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
2290: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
22a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
22b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
22c0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
22d0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
22e0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
22f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2300: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2310: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
2320: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
2330: 73 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  st;.  if( pToken
2340: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2350: 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29  pToken->dyn==0 )
2360: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
2370: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
2380: 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2390: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d  token.z = 0;.  }
23a0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
23b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72  pNew->token;.  r
23c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
23d0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
23e0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
23f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2400: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
2410: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
2420: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
2430: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
2440: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
2450: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
2460: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
2470: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
2480: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
2490: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
24a0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
24b0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
24c0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
24d0: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
24e0: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
24f0: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2500: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2510: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2520: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2530: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2540: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2550: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
2560: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
2570: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
2580: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
2590: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
25a0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
25b0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
25c0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
25d0: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
25e0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
25f0: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2600: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2610: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2620: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2630: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2640: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2650: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
2660: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
2670: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2680: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
2690: 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ken;.  if( pExpr
26a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
26b0: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
26c0: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
26d0: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
26e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
26f0: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2700: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2710: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2720: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2730: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2740: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2750: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
2760: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2770: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
2780: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2790: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
27a0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
27b0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
27c0: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
27d0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
27e0: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
27f0: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2800: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2810: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2820: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2830: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2840: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 26 70  le = i = atoi(&p
2850: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
2860: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53    if( i<1 || i>S
2870: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
2880: 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20  LE_NUMBER ){.   
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
28b0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
28c0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
28d0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
28e0: 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41     SQLITE_MAX_VA
28f0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
2900: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2910: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
2920: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
2930: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
2940: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
2950: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
2960: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
2970: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
2980: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
2990: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
29a0: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
29b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
29c0: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
29d0: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
29e0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
29f0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
2a00: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
2a10: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
2a20: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
2a30: 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20  n = pToken->n;. 
2a40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
2a50: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
2a60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
2a70: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
2a80: 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  (pE = pParse->ap
2a90: 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20  VarExpr[i])!=0. 
2aa0: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
2ab0: 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20  token.n==n.     
2ac0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
2ad0: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b  E->token.z, pTok
2ae0: 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  en->z, n)==0 ){.
2af0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2b00: 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62  Table = pE->iTab
2b10: 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  le;.        brea
2b20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2b30: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72  .    if( i>=pPar
2b40: 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a  se->nVarExpr ){.
2b50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
2b60: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
2b70: 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20  nVar;.      if( 
2b80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b90: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
2ba0: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
2bb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2bc0: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
2bd0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2be0: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
2bf0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c00: 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  xpr = sqliteReal
2c10: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 70 56 61  loc(pParse->apVa
2c20: 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  rExpr,.         
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2c40: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2c50: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
2c60: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
2c70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2c80: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d    if( !sqlite3_m
2c90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
2ca0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cb0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2cc0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
2cd0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2ce0: 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  r[pParse->nVarEx
2cf0: 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20  pr++] = pExpr;. 
2d00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d10: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72   .}../*.** Recur
2d20: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d50: 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72  3ExprDelete(Expr
2d60: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
2d70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2d80: 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73   p->span.dyn ) s
2d90: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
2da0: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
2db0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
2dc0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
2dd0: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
2de0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2df0: 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  lete(p->pLeft);.
2e00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2e10: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
2e20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2e30: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
2e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2e50: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
2e60: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
2e70: 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ee(p);.}.../*.**
2e80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2e90: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
2ea0: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
2eb0: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
2ec0: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
2ed0: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
2ee0: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
2ef0: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
2f00: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
2f10: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
2f20: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
2f30: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
2f40: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
2f50: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
2f60: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
2f70: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
2f80: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
2f90: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
2fa0: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
2fb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
2fc0: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
2fd0: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
2fe0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
2ff0: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
3000: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
3010: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
3020: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
3030: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
3040: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
3050: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
3060: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
3070: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
3080: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f  t duplicated..*/
3090: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
30a0: 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a  prDup(Expr *p){.
30b0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
30c0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
30d0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
30e0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
30f0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3100: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3110: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
3120: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
3130: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
3140: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
3150: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3160: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  z = sqliteStrNDu
3170: 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  p(p->token.z, p-
3180: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70  >token.n);.    p
3190: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
31a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
31b0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
31c0: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
31d0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
31e0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
31f0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
3200: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
3210: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
3220: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3230: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
3240: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
3250: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
3260: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
3270: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3280: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
3290: 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d  Select);.  pNew-
32a0: 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b  >pTab = p->pTab;
32b0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
32c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
32d0: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
32e0: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
32f0: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3300: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
3310: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
3320: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
3330: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
3340: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
3350: 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  >z = sqliteStrND
3360: 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  up(pFrom->z, pFr
3370: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
3380: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
3390: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
33a0: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
33b0: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
33c0: 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a  stDup(ExprList *
33d0: 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  p){.  ExprList *
33e0: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
33f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
3400: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
3410: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
3420: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3430: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
3440: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
3450: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
3460: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3470: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
3480: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
3490: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
34a0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
34b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
34c0: 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nExpr*sizeof(p->
34d0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
34e0: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
34f0: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
3500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3510: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
3520: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
3530: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
3540: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
3550: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
3560: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
3570: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
3580: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
3590: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
35a0: 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20  rDup(pOldExpr = 
35b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29  pOldItem->pExpr)
35c0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
35d0: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
35e0: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
35f0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
3600: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
3610: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
3620: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
3630: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
3640: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
3650: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
3660: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
3670: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
3680: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
3690: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
36a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
36b0: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
36c0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
36d0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
36e0: 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  (&pNewExpr->span
36f0: 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  , &pOldExpr->spa
3700: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  n);.    }.    as
3710: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d  sert( pNewExpr==
3720: 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73  0 || pNewExpr->s
3730: 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20  pan.z!=0 .      
3740: 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70        || pOldExp
3750: 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20  r->span.z==0 || 
3760: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
3770: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74  ailed );.    pIt
3780: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3790: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
37a0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
37b0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
37c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
37d0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
37e0: 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74  ->isAgg = pOldIt
37f0: 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70  em->isAgg;.    p
3800: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
3810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3820: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63  w;.}../*.** If c
3830: 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73  ursors, triggers
3840: 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  , views and subq
3850: 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f  ueries are all o
3860: 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  mitted from.** t
3870: 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e  he build, then n
3880: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
3890: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65  wing routines, e
38a0: 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71  xcept for .** sq
38b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
38c0: 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  , can be called.
38d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
38e0: 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  p() is sometimes
38f0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20  .** called with 
3900: 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  a NULL argument.
3910: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
3920: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
3930: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
3940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3950: 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e  ER) \. || !defin
3960: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
3970: 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74  UBQUERY).SrcList
3980: 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
3990: 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  Dup(SrcList *p){
39a0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
39b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
39c0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d   nByte;.  if( p=
39d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
39e0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
39f0: 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30  *p) + (p->nSrc>0
3a00: 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30   ? sizeof(p->a[0
3a10: 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29  ]) * (p->nSrc-1)
3a20: 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20   : 0);.  pNew = 
3a30: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3a40: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
3a50: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3a60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63   0;.  pNew->nSrc
3a70: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3a80: 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72  = p->nSrc;.  for
3a90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b  (i=0; i<p->nSrc;
3aa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3ab0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ac0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
3ad0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
3b00: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
3b10: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
3b20: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3b30: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
3b40: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3b50: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
3b60: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3b70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
3b80: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
3b90: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
3ba0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
3bb0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
3bc0: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
3bd0: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
3be0: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
3bf0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
3c00: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
3c10: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
3c20: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
3c30: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  if( pNewItem->pT
3c40: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ab ){.      pNew
3c50: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72  Item->pTab->isTr
3c60: 61 6e 73 69 65 6e 74 20 3d 20 30 3b 0a 20 20 20  ansient = 0;.   
3c70: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
3c80: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
3c90: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64  e3SelectDup(pOld
3ca0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
3cb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
3cc0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
3cd0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  up(pOldItem->pOn
3ce0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3cf0: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
3d00: 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49  3IdListDup(pOldI
3d10: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
3d20: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
3d30: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
3d40: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
3d50: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
3d60: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
3d70: 69 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70  istDup(IdList *p
3d80: 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65  ){.  IdList *pNe
3d90: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  w;.  int i;.  if
3da0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3db0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
3dc0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
3dd0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
3de0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3df0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3e00: 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  nId = pNew->nAll
3e10: 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70  oc = p->nId;.  p
3e20: 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d  New->a = sqliteM
3e30: 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64  allocRaw( p->nId
3e40: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
3e50: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
3e60: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
3e70: 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  teFree(pNew);.  
3e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3ea0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
3eb0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3ec0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
3ed0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
3ee0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
3ef0: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
3f00: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
3f10: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
3f20: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3f30: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3f40: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
3f50: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
3f60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3f70: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
3f80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65  ite3SelectDup(Se
3f90: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
3fa0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
3fb0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3fc0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3fd0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3fe0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3ff0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4000: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
4010: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
4020: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
4030: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
4040: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45  xprListDup(p->pE
4050: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
4060: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
4070: 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29  ListDup(p->pSrc)
4080: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
4090: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
40a0: 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  p(p->pWhere);.  
40b0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
40c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
40d0: 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  Dup(p->pGroupBy)
40e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
40f0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
4100: 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  up(p->pHaving);.
4110: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
4120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4130: 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42  stDup(p->pOrderB
4140: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  y);.  pNew->op =
4150: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
4160: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
4170: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72  SelectDup(p->pPr
4180: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ior);.  pNew->pL
4190: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
41a0: 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29  prDup(p->pLimit)
41b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
41c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
41d0: 75 70 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  up(p->pOffset);.
41e0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
41f0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66   -1;.  pNew->iOf
4200: 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  fset = -1;.  pNe
4210: 77 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20  w->ppOpenTemp = 
4220: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 46 65 74 63  0;.  pNew->pFetc
4230: 68 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  h = 0;.  pNew->i
4240: 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69  sResolved = p->i
4250: 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65  sResolved;.  pNe
4260: 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  w->isAgg = p->is
4270: 41 67 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  Agg;.  return pN
4280: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
4290: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
42a0: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
42b0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
42c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
42d0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
42e0: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
42f0: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
4300: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
4310: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
4320: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
4330: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
4340: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4350: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
4360: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
4370: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
4380: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
4390: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
43a0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69  Name){.  if( pLi
43b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
43c0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
43d0: 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  c( sizeof(ExprLi
43e0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
43f0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
4400: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
4410: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
4420: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30  pList->nAlloc==0
4430: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
4440: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69  ist->nAlloc<=pLi
4450: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
4460: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
4470: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e  _item *a;.    in
4480: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  t n = pList->nAl
4490: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61  loc*2 + 4;.    a
44a0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
44b0: 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a  (pList->a, n*siz
44c0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
44d0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
44e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
44f0: 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
4500: 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
4510: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
4520: 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = n;.  }.  asser
4530: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29  t( pList->a!=0 )
4540: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c  ;.  if( pExpr ||
4550: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74   pName ){.    st
4560: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
4570: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
4580: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
4590: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
45a0: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
45b0: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
45c0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
45d0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
45e0: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
45f0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
4600: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
4610: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
4620: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
4630: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
4640: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
4650: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
4660: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4670: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
4680: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4690: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
46a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c   0;.}../*.** Del
46b0: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
46c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
46d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
46e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70  prListDelete(Exp
46f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4700: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
4710: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4720: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
4730: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
4740: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4750: 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d  >a!=0 || (pList-
4760: 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69  >nExpr==0 && pLi
4770: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29  st->nAlloc==0) )
4780: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
4790: 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d  t->nExpr<=pList-
47a0: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72  >nAlloc );.  for
47b0: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
47c0: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
47d0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
47e0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
47f0: 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
4800: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
4810: 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
4820: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
4830: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
4840: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
4850: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
4860: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
4870: 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c  sion tree.  Call
4880: 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20   xFunc for each 
4890: 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a  node visited..**
48a0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
48b0: 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20  alue from xFunc 
48c0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
48d0: 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  er the tree walk
48e0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30   continues..** 0
48f0: 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20   means continue 
4900: 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65  walking the tree
4910: 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f  .  1 means do no
4920: 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a  t walk children.
4930: 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ** of the curren
4940: 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69  t node but conti
4950: 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67  nue with sibling
4960: 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e  s.  2 means aban
4970: 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  don.** the tree 
4980: 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e  walk completely.
4990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
49a0: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69  n value from thi
49b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74  s routine is 1 t
49c0: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
49d0: 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30  ee walk.** and 0
49e0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f   to continue..*/
49f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
4a00: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
4a10: 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69  t *, int (*)(voi
4a20: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
4a30: 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  d *);.static int
4a40: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78   walkExprTree(Ex
4a50: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28  pr *pExpr, int (
4a60: 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78  *xFunc)(void*,Ex
4a70: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
4a80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
4a90: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
4aa0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28  turn 0;.  rc = (
4ab0: 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45  *xFunc)(pArg, pE
4ac0: 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  xpr);.  if( rc==
4ad0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c  0 ){.    if( wal
4ae0: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
4af0: 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70  >pLeft, xFunc, p
4b00: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
4b10: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4b20: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69  rTree(pExpr->pRi
4b30: 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ght, xFunc, pArg
4b40: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4b50: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69    if( walkExprLi
4b60: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
4b70: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
4b90: 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a  return rc>1;.}..
4ba0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
4bb0: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
4bc0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
4bd0: 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61  n list p..*/.sta
4be0: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
4bf0: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
4c00: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
4c10: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
4c20: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
4c30: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
4c40: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4c50: 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  em;.  if( !p ) r
4c60: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
4c70: 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  =p->nExpr, pItem
4c80: 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  =p->a; i>0; i--,
4c90: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
4ca0: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4cb0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46  pItem->pExpr, xF
4cc0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4cd0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4ce0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4cf0: 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65  Call walkExprTre
4d00: 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  e() for every ex
4d10: 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65  pression in Sele
4d20: 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ct p, not includ
4d30: 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
4d40: 6e 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  ns that are part
4d50: 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20   of sub-selects 
4d60: 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75  in any FROM clau
4d70: 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a  se or the LIMIT.
4d80: 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70  ** or OFFSET exp
4d90: 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74  ressions...*/.st
4da0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c  atic int walkSel
4db0: 65 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a  ectExpr(Select *
4dc0: 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  p, int (*xFunc)(
4dd0: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
4de0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
4df0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
4e00: 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  EList, xFunc, pA
4e10: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  rg);.  walkExprT
4e20: 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78  ree(p->pWhere, x
4e30: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
4e40: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
4e50: 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20  GroupBy, xFunc, 
4e60: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
4e70: 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67  rTree(p->pHaving
4e80: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
4e90: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
4ea0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e  ->pOrderBy, xFun
4eb0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 72 65 74 75  c, pArg);.  retu
4ec0: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
4ed0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4ee0: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
4ef0: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
4f00: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70  rTree()..**.** p
4f10: 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20  Arg is really a 
4f20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
4f30: 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61  teger.  If we ca
4f40: 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e  n tell by lookin
4f50: 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68  g.** at pExpr th
4f60: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
4f70: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
4f80: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63  pExpr is not a c
4f90: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
4fa0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  ssion, then set 
4fb0: 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72  *pArg to 0 and r
4fc0: 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64  eturn 2 to aband
4fd0: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
4fe0: 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f  ..** If pExpr do
4ff0: 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71  es does not disq
5000: 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65  ualify the expre
5010: 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67  ssion from being
5020: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74   a constant.** t
5030: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
5040: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b  **.** After walk
5050: 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ing the whole tr
5060: 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20  ee, if no nodes 
5070: 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64  are found that d
5080: 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65  isqualify.** the
5090: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63   expression as c
50a0: 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65  onstant, then we
50b0: 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c   assume the whol
50c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
50d0: 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65  is constant.  Se
50e0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
50f0: 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64  onstant() for ad
5100: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
5110: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5120: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
5130: 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72  nstant(void *pAr
5140: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
5150: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
5160: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5170: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
5180: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
5190: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
51a0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
51b0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
51c0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 23 69 66  TK_FUNCTION:.#if
51d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
51e0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
51f0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
5200: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
5210: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a  :.#endif.      *
5220: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
5230: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
5240: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
5250: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5260: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b   }.}../*.** Walk
5270: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5280: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
5290: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
52a0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
52b0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
52c0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a  lves variables..
52d0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
52e0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
52f0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
5300: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
5310: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
5320: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
5330: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
5340: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
5350: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
5360: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
5370: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5380: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
5390: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73  pr *p){.  int is
53a0: 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c  Const = 1;.  wal
53b0: 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78 70  kExprTree(p, exp
53c0: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c  rNodeIsConstant,
53d0: 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65   &isConst);.  re
53e0: 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a  turn isConst;.}.
53f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  ./*.** If the ex
5400: 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73  pression p codes
5410: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
5420: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
5430: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
5440: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
5450: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
5460: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
5470: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
5480: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
5490: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
54a0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
54b0: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
54c0: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
54d0: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
54e0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
54f0: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
5500: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
5510: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
5520: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
5530: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
5540: 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63  pValue){.  switc
5550: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
5560: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
5570: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
5580: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
5590: 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29  token.z, pValue)
55a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
55b0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
55c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
55d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
55e0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
55f0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  rn sqlite3ExprIs
5600: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
5610: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  , pValue);.    }
5620: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
5630: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
5640: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
5650: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
5660: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
5670: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
5680: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
5690: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
56a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
56b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
56c0: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
56d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
56e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
56f0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
5700: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
5710: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
5720: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
5730: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
5740: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
5750: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
5760: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
5770: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
5780: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
5790: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
57a0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
57b0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
57c0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
57d0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
57e0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
57f0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
5800: 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  mn of the form X
5810: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
5820: 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a  ust Z, look up.*
5830: 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74  * that name in t
5840: 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65  he set of source
5850: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c   tables in pSrcL
5860: 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65  ist and make the
5870: 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65   pExpr .** expre
5880: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
5890: 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f   back to that so
58a0: 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  urce column.  Th
58b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
58c0: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
58d0: 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20  to pExpr:.**.** 
58e0: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20     pExpr->iDb   
58f0: 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65 20          Set the 
5900: 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62  index in db->aDb
5910: 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
5920: 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20  se holding.**   
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e        the table.
5950: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
5960: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
5970: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
5980: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5990: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le obtained.**  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63         from pSrc
59c0: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
59d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20  r->iColumn      
59e0: 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   Set to the colu
59f0: 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
5a00: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
5a10: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
5a20: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b         Set to TK
5a30: 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70  _COLUMN..**    p
5a40: 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20  Expr->pLeft     
5a50: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
5a60: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
5a70: 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  o is deleted.** 
5a80: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
5a90: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
5aa0: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
5ab0: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
5ac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54  ..**.** The pDbT
5ad0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
5ae0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5af0: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
5b00: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
5b10: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
5b20: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
5b30: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
5b40: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
5b50: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
5b60: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70   be used.  The p
5b70: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68  TableToken is th
5b80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5b90: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
5ba0: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
5bb0: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62  n be NULL if pDb
5bc0: 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55  Token is also NU
5bd0: 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f  LL.  If pTableTo
5be0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ken is NULL it.*
5bf0: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
5c00: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
5c10: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
5c20: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
5c30: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
5c40: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
5c50: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
5c60: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
5c70: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
5c80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5c90: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
5ca0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
5cb0: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
5cc0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
5cd0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
5ce0: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
5cf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5d00: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
5d10: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5d20: 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a  pDbToken,     /*
5d30: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
5d40: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
5d50: 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20   table, or NULL 
5d60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
5d70: 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d  leToken,  /* Nam
5d80: 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61  e of table conta
5d90: 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72  ining column, or
5da0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
5db0: 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20   *pColumnToken, 
5dc0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
5dd0: 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65  olumn. */.  Name
5de0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
5df0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
5e00: 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65 73  text used to res
5e10: 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f  olve the name */
5e20: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
5e30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
5e40: 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70  this EXPR node p
5e50: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65  oint to the sele
5e60: 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29  cted column */.)
5e70: 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  {.  char *zDb = 
5e80: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
5e90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5ea0: 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e  .  The "X" in X.
5eb0: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
5ec0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
5ed0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
5ee0: 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20  le.  The "Y" in 
5ef0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a  X.Y.Z or Y.Z */.
5f00: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30    char *zCol = 0
5f10: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
5f20: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  f the column.  T
5f30: 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20  he "Z" */.  int 
5f40: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
5f50: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
5f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s */.  int cnt =
5f70: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
5f80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
5f90: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  g column names *
5fa0: 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d  /.  int cntTab =
5fb0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62   0;      /* Numb
5fc0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74  er of matching t
5fd0: 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  able names */.  
5fe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5ff0: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
6000: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
6010: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
6020: 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20  tem *pItem;     
6030: 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f    /* Use for loo
6040: 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c 69  ping over pSrcLi
6050: 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74  st items */.  st
6060: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
6070: 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20  m *pMatch = 0;  
6080: 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67 20  /* The matching 
6090: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f  pSrcList item */
60a0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
60b0: 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20  pTopNC = pNC;   
60c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 61       /* First na
60d0: 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68 65  mecontext in the
60e0: 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65   list */..  asse
60f0: 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  rt( pColumnToken
6100: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
6110: 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20  ->z ); /* The Z 
6120: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
6130: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62  be NULL */.  zDb
6140: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6150: 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e  omToken(pDbToken
6160: 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  );.  zTab = sqli
6170: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6180: 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20  (pTableToken);. 
6190: 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e   zCol = sqlite3N
61a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f  ameFromToken(pCo
61b0: 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  lumnToken);.  if
61c0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
61d0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  _failed ){.    g
61e0: 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  oto lookupname_e
61f0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72  nd;.  }..  pExpr
6200: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
6210: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63   while( pNC && c
6220: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 53 72 63  nt==0 ){.    Src
6230: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
6240: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
6250: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
6260: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
6270: 73 74 3b 0a 0a 20 20 20 20 70 4e 43 2d 3e 6e 52  st;..    pNC->nR
6280: 65 66 2b 2b 3b 0a 20 20 20 20 2f 2a 20 61 73 73  ef++;.    /* ass
6290: 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20  ert( zTab==0 || 
62a0: 70 45 4c 69 73 74 3d 3d 30 20 29 3b 20 2a 2f 0a  pEList==0 ); */.
62b0: 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74      if( pSrcList
62c0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
62d0: 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73  0, pItem=pSrcLis
62e0: 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74  t->a; i<pSrcList
62f0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
6300: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54  em++){.        T
6310: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
6320: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
6330: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
6340: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
6350: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
6360: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
6370: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
6380: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
6390: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
63a0: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
63b0: 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  as ){.          
63c0: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
63d0: 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   = pItem->zAlias
63e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
63f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6400: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29  (zTabName, zTab)
6410: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
6420: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
6440: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
6450: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
6460: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
6470: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
6480: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
6490: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f  e, zTab)!=0 ) co
64a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
64b0: 20 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26      if( zDb!=0 &
64c0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
64d0: 28 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69  (db->aDb[pTab->i
64e0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  Db].zName, zDb)!
64f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6500: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6510: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6530: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  }.        if( 0=
6540: 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20  =(cntTab++) ){. 
6550: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6560: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
6570: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
6580: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
6590: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
65a0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
65b0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
65c0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
65d0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
65e0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
65f0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
6600: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6610: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
6620: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
6630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6640: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
6650: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6660: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
6680: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
6690: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
66a0: 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62  >iDb = pTab->iDb
66b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
66c0: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
66d0: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
66e0: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
66f0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
6700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6710: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
6720: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
6730: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
6740: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
6750: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
6760: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
6770: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6780: 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  pColl = pTab->aC
6790: 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
67a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
67b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
67c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
67d0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
67e0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
67f0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
6800: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
6810: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
6820: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
6830: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
6840: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
6850: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
6860: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
6870: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
6880: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
6890: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
68a0: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
68b0: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
68c0: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
68d0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
68e0: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
68f0: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
6900: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
6910: 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31  ck->newIdx != -1
6920: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6930: 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20  mp("new", zTab) 
6940: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
6950: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6960: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
6970: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61  ewIdx;.        a
6980: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
6990: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
69a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
69b0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
69c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
69d0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
69e0: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
69f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6a00: 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20  "old", zTab)==0 
6a10: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
6a20: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
6a30: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
6a40: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6a50: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6a60: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
6a70: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
6a80: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
6a90: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6aa0: 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20  pTab ){ .       
6ab0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
6ac0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
6ad0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20  Tab->aCol;..    
6ae0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
6af0: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
6b00: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
6b10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6b20: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   < pTab->nCol; j
6b30: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
6b40: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6b50: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
6b60: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
6b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6b80: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
6b90: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
6ba0: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
6bb0: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
6bc0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6bd0: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
6be0: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
6bf0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
6c00: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54  Expr->pColl = pT
6c10: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
6c20: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
6c30: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61  Expr->pTab = pTa
6c40: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  b;.            b
6c50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6c60: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6c70: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
6c80: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
6c90: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
6ca0: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
6cb0: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
6cc0: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
6cd0: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
6ce0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6cf0: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
6d00: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  ==1 && sqlite3Is
6d10: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20  Rowid(zCol) ){. 
6d20: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
6d30: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6d40: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
6d50: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
6d60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
6d70: 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  GER;.    }..    
6d80: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  /*.    ** If the
6d90: 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65   input is of the
6da0: 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a   form Z (not Y.Z
6db0: 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20   or X.Y.Z) then 
6dc0: 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a  the name Z.    *
6dd0: 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f  * might refer to
6de0: 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61   an result-set a
6df0: 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70  lias.  This happ
6e00: 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
6e10: 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65  , when.    ** we
6e20: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e   are resolving n
6e30: 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ames in the WHER
6e40: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
6e50: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
6e60: 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
6e70: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
6e80: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
6e90: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20  WHERE x<10;.    
6ea0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73  **.    ** In cas
6eb0: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
6ec0: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
6ed0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
6ee0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
6ef0: 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20     ** forms the 
6f00: 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79  result set entry
6f10: 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65   ("a+b" in the e
6f20: 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75  xample) and retu
6f30: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
6f40: 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
6f50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6f60: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6f70: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  t should have al
6f80: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
6f90: 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68  * resolved by th
6fa0: 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45  e time the WHERE
6fb0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c   clause is resol
6fc0: 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ved..    */.    
6fd0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45  if( cnt==0 && pE
6fe0: 4c 69 73 74 21 3d 30 20 26 26 20 7a 54 61 62 3d  List!=0 && zTab=
6ff0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
7000: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
7010: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
7020: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
7030: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
7040: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
7050: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
7060: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
7070: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
7080: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
7090: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
70a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
70b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  );.          pEx
70c0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
70d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
70e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
70f0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
7100: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
7110: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
7120: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
7130: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7140: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zCol);.         
7150: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
7160: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
7170: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
7180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7190: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
71a0: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
71b0: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
71c0: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
71d0: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
71e0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
71f0: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
7200: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
7210: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
7220: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
7230: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
7240: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
7250: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
7260: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
7270: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
7280: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
7290: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
72a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
72b0: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
72c0: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
72d0: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
72e0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
72f0: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
7300: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
7310: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
7320: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
7330: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
7340: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
7350: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
7360: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
7370: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
7380: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
7390: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
73a0: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
73b0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
73c0: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
73d0: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
73e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
73f0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
7400: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
7410: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
7420: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
7430: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
7440: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
7450: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
7460: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
7470: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
7480: 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  1 ){.    char *z
7490: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
74a0: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
74b0: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
74c0: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a  ch column: %s" :
74d0: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
74e0: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20  mn name: %s";.  
74f0: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
7500: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
7510: 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22  ing(&z, zDb, "."
7520: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7530: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l, 0);.    }else
7540: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
7550: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
7560: 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e  ing(&z, zTab, ".
7570: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
7580: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
7590: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
75a0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
75b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
75c0: 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29  pParse, zErr, z)
75d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
75e0: 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d  (z);.    pTopNC-
75f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nErr++;.  }..  
7600: 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66  /* If a column f
7610: 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70  rom a table in p
7620: 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72  SrcList is refer
7630: 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f  enced, then reco
7640: 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63  rd.  ** this fac
7650: 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73  t in the pSrcLis
7660: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69  t.a[].colUsed bi
7670: 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30  tmask.  Column 0
7680: 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74   causes.  ** bit
7690: 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43   0 to be set.  C
76a0: 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74  olumn 1 sets bit
76b0: 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74   1.  And so fort
76c0: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  h.  If the.  ** 
76d0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73  column number is
76e0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
76f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7700: 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a   in the bitmask.
7710: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68    ** then set th
7720: 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74  e high-order bit
7730: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e   of the bitmask.
7740: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
7750: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
7760: 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20   pMatch!=0 ){.  
7770: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
7780: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  >iColumn;.    if
7790: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n>=sizeof(Bitm
77a0: 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20  ask)*8 ){.      
77b0: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  n = sizeof(Bitma
77c0: 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20  sk)*8-1;.    }. 
77d0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
77e0: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
77f0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
7800: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
7810: 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c   |= 1<<n;.  }..l
7820: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
7830: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
7840: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
7850: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
7860: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
7870: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
7880: 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zCol);.  sqlite
7890: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
78a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
78b0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
78c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
78d0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
78e0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
78f0: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
7900: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
7910: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b  .  if( cnt==1 ){
7920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43  .    assert( pNC
7930: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
7940: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
7950: 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70  e, pExpr, pNC->p
7960: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  SrcList);.    if
7970: 28 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61  ( pMatch && !pMa
7980: 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tch->pSelect ){.
7990: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
79a0: 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62  b = pMatch->pTab
79b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
79c0: 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a  turn cnt!=1;.}..
79d0: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
79e0: 20 6e 6f 64 65 20 74 68 61 74 20 64 65 66 69 6e   node that defin
79f0: 65 73 20 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66  es a function of
7a00: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20   some kind.  It 
7a10: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 79  might.** be a sy
7a20: 6e 74 61 63 74 69 63 20 66 75 6e 63 74 69 6f 6e  ntactic function
7a30: 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 78 29 22   like "count(x)"
7a40: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
7a50: 61 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68  a function.** th
7a60: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e  at implements an
7a70: 20 6f 70 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20   operator, like 
7a80: 22 61 20 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a  "a LIKE b".  .**
7a90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7aa0: 20 6d 61 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70   makes *pzName p
7ab0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  oint to the name
7ac0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
7ad0: 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65   and .** *pnName
7ae0: 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62 65 72   hold the number
7af0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
7b00: 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  n the function n
7b10: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ame..*/.static v
7b20: 6f 69 64 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e  oid getFunctionN
7b30: 61 6d 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ame(Expr *pExpr,
7b40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7b50: 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d  Name, int *pnNam
7b60: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45  e){.  switch( pE
7b70: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7b80: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
7b90: 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65   {.      *pzName
7ba0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
7bb0: 7a 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65  z;.      *pnName
7bc0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
7bd0: 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  n;.      break;.
7be0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7bf0: 4b 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20  K_LIKE: {.      
7c00: 2a 70 7a 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22  *pzName = "like"
7c10: 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20  ;.      *pnName 
7c20: 3d 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 4;.      break
7c30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7c40: 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_GLOB: {.    
7c50: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f    *pzName = "glo
7c60: 62 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d  b";.      *pnNam
7c70: 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62 72 65  e = 4;.      bre
7c80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7c90: 73 65 20 54 4b 5f 43 54 49 4d 45 3a 20 7b 0a 20  se TK_CTIME: {. 
7ca0: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22       *pzName = "
7cb0: 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 3b 0a 20  current_time";. 
7cc0: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31       *pnName = 1
7cd0: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
7ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7cf0: 4b 5f 43 44 41 54 45 3a 20 7b 0a 20 20 20 20 20  K_CDATE: {.     
7d00: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72   *pzName = "curr
7d10: 65 6e 74 5f 64 61 74 65 22 3b 0a 20 20 20 20 20  ent_date";.     
7d20: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
7d30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7d40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54  }.    case TK_CT
7d50: 49 4d 45 53 54 41 4d 50 3a 20 7b 0a 20 20 20 20  IMESTAMP: {.    
7d60: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72    *pzName = "cur
7d70: 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 22 3b  rent_timestamp";
7d80: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
7d90: 20 31 37 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   17;.      break
7da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7db0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7dc0: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
7dd0: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
7de0: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
7df0: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62  .** Resolve symb
7e00: 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20  olic names into 
7e10: 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74  TK_COLUMN operat
7e20: 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ors for the curr
7e30: 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74  ent.** node in t
7e40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
7e50: 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f  ee.  Return 0 to
7e60: 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65   continue the se
7e70: 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65  arch down.** the
7e80: 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62   tree or 2 to ab
7e90: 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c  ort the tree wal
7ea0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
7eb0: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
7ec0: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61  error checking a
7ed0: 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  nd name resoluti
7ee0: 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69  on for.** functi
7ef0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f  on names.  The o
7f00: 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72  perator for aggr
7f10: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
7f20: 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f  is changed.** to
7f30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
7f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7f50: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
7f60: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
7f70: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
7f80: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
7f90: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41  (NameContext*)pA
7fa0: 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rg;.  SrcList *p
7fb0: 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73 65  SrcList;.  Parse
7fc0: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
7fd0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
7fe0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
7ff0: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72 63  pNC!=0 );.  pSrc
8000: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
8010: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20 3d  List;.  pParse =
8020: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pNC->pParse;.. 
8030: 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
8040: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
8050: 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65  P_Resolved) ) re
8060: 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53 65  turn 1;.  ExprSe
8070: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
8080: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
8090: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
80a0: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
80b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
80c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
80d0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
80e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
80f0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
8100: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
8110: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
8120: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8140: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
8150: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
8160: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
8170: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
8180: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
8190: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
81a0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
81b0: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
81c0: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
81d0: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
81e0: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
81f0: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
8200: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
8210: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
8220: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
8230: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8240: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
8250: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
8260: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8270: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
8280: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
8290: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
82a0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
82b0: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
82c0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
82d0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
82e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
82f0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
8300: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
8310: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
8320: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
8330: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
8340: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
8350: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
8360: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
8370: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
8380: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
8390: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
83a0: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
83b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
83c0: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
83d0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
83e0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
83f0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
8400: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
8410: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
8420: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
8430: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
8440: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
8450: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
8460: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8470: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
8480: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
8490: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
84a0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
84b0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
84c0: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
84d0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
84e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
84f0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
8500: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
8510: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
8520: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8530: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8540: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
8550: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8560: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
8570: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
8580: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8590: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
85a0: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
85b0: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
85c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
85d0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
85e0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
85f0: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
8600: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54  /.    case TK_CT
8610: 49 4d 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IME:.    case TK
8620: 5f 43 54 49 4d 45 53 54 41 4d 50 3a 0a 20 20 20  _CTIMESTAMP:.   
8630: 20 63 61 73 65 20 54 4b 5f 43 44 41 54 45 3a 0a   case TK_CDATE:.
8640: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
8650: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  :.    case TK_LI
8660: 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  KE:.    case TK_
8670: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
8680: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8690: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
86a0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75  ;    /* The argu
86b0: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
86c0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
86d0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
86e0: 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  : 0;  /* Number 
86f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8700: 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63        int no_suc
8710: 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20  h_func = 0;     
8720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20    /* True if no 
8730: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78  such function ex
8740: 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ists */.      in
8750: 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  t wrong_num_args
8760: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
8770: 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65  e if wrong numbe
8780: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8790: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61  /.      int is_a
87a0: 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gg = 0;         
87b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
87c0: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66  s an aggregate f
87d0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
87e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
87f0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
8800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8810: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
8820: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
8830: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
8840: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
8850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
8860: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
8870: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
8880: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
8890: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
88a0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
88b0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
88c0: 74 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  t enc = pParse->
88d0: 64 62 2d 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65  db->enc;  /* The
88e0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
88f0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 67 65 74  ng */..      get
8900: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78  FunctionName(pEx
8910: 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b  pr, &zId, &nId);
8920: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
8930: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
8940: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
8950: 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  d, nId, n, enc, 
8960: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
8970: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
8980: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
8990: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
89a0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
89b0: 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -1, enc, 0);. 
89c0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
89d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
89e0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
89f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
8a00: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
8a10: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
8a20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
8a40: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
8a50: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  nc==0;.      }. 
8a60: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
8a70: 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  && !pNC->allowAg
8a80: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
8a90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8aa0: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
8ab0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8ac0: 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  on %.*s()", nId,
8ad0: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
8ae0: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
8af0: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
8b00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
8b10: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20  o_such_func ){. 
8b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8b30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8b40: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  no such function
8b50: 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49  : %.*s", nId, zI
8b60: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
8b70: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nErr++;.      }
8b80: 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e  else if( wrong_n
8b90: 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20  um_args ){.     
8ba0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8bb0: 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67  sg(pParse,"wrong
8bc0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
8bd0: 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
8be0: 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20   %.*s()",.      
8bf0: 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29         nId, zId)
8c00: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8c10: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Err++;.      }. 
8c20: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
8c30: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
8c40: 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55  ->op = TK_AGG_FU
8c50: 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  NCTION;.        
8c60: 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b  pNC->hasAgg = 1;
8c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8c80: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
8c90: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20  >allowAgg = 0;. 
8ca0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e       for(i=0; pN
8cb0: 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  C->nErr==0 && i<
8cc0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
8cd0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 4c   walkExprTree(pL
8ce0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
8cf0: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
8d00: 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d  p, pNC);.      }
8d10: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
8d20: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
8d30: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  g = 1;.      /* 
8d40: 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65  FIX ME:  Compute
8d50: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
8d60: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78   based on the ex
8d70: 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20  pected return.  
8d80: 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74      ** type of t
8d90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20  he function .   
8da0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
8db0: 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d  rn is_agg;.    }
8dc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8dd0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
8de0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
8df0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
8e00: 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20  ISTS:.#endif.   
8e10: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
8e20: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
8e30: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8e40: 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e     int nRef = pN
8e50: 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20  C->nRef;.       
8e60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
8e70: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45  solve(pParse, pE
8e80: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e  xpr->pSelect, pN
8e90: 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  C);.        asse
8ea0: 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e  rt( pNC->nRef>=n
8eb0: 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69  Ref );.        i
8ec0: 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52  f( nRef!=pNC->nR
8ed0: 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ef ){.          
8ee0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
8ef0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
8f00: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
8f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8f20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8f30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8f40: 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70  ine walks an exp
8f50: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
8f60: 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65   resolves refere
8f70: 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65  nces to.** table
8f80: 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73   columns.  Nodes
8f90: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e   of the form ID.
8fa0: 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65  ID or ID resolve
8fb0: 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65   into an.** inde
8fc0: 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  x to the table i
8fd0: 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74  n the table list
8fe0: 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66   and a column of
8ff0: 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45  fset.  The .** E
9000: 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73  xpr.opcode for s
9010: 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61  uch nodes is cha
9020: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
9030: 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54 61  N.  The Expr.iTa
9040: 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  ble.** value is 
9050: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
9060: 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66 65  ndex of the refe
9070: 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20  renced table in 
9080: 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73  pTabList.** plus
9090: 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c 75   the "base" valu
90a0: 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61 6c  e.  The base val
90b0: 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ue will ultimate
90c0: 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a  ly become the.**
90d0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
90e0: 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ber for a cursor
90f0: 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
9100: 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72  g into the refer
9110: 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20  enced.** table. 
9120: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
9130: 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  n value is chang
9140: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
9150: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a  of the column .*
9160: 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  * of the referen
9170: 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ced table.  The 
9180: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
9190: 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ue for the speci
91a0: 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75  al.** ROWID colu
91b0: 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49  mn is -1.  Any I
91c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
91d0: 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69  EY column is tri
91e0: 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61  ed as an.** alia
91f0: 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a  s for ROWID..**.
9200: 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20  ** Also resolve 
9210: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
9220: 6e 64 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e  nd check the fun
9230: 63 74 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65  ctions for prope
9240: 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b  r.** usage.  Mak
9250: 65 20 73 75 72 65 20 61 6c 6c 20 66 75 6e 63 74  e sure all funct
9260: 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65  ion names are re
9270: 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c  cognized and all
9280: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61   functions.** ha
9290: 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  ve the correct n
92a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
92b0: 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72  ts.  Leave an er
92c0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
92d0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
92e0: 67 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  g if anything is
92f0: 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20   amiss.  Return 
9300: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
9310: 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rors..**.** If t
9320: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  he expression co
9330: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
9340: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20   functions then 
9350: 73 65 74 20 74 68 65 20 45 50 5f 41 67 67 0a 2a  set the EP_Agg.*
9360: 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68  * property on th
9370: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
9380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
9390: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 0a 20 20  ResolveNames(.  
93a0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
93b0: 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  ,       /* Names
93c0: 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  pace to resolve 
93d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20  expressions in. 
93e0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9400: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
9410: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
9420: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
9430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9440: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
9450: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
9460: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
9470: 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20  if( pNC->nErr>0 
9480: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
9490: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
94a0: 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  _Error);.  }.  r
94b0: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
94c0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
94d0: 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Error);.}../*.**
94e0: 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61   A pointer insta
94f0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
9500: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
9510: 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
9520: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c  n.** through wal
9530: 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63  kExprTree into c
9540: 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28  odeSubqueryStep(
9550: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
9560: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
9570: 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75  QueryCoder;.stru
9580: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a  ct QueryCoder {.
9590: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
95a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
95b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
95c0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
95d0: 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73  pNC;    /* Names
95e0: 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e  pace of first en
95f0: 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f  closing query */
9600: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  .};.../*.** Gene
9610: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 75  rate code for su
9620: 62 71 75 65 72 69 65 73 20 61 6e 64 20 49 4e 20  bqueries and IN 
9630: 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  operators..**.**
9640: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 63 6f   IN operators co
9650: 6d 65 73 20 69 6e 20 74 77 6f 20 66 6f 72 6d 73  mes in two forms
9660: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
9670: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
9680: 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20  ist).** and.**  
9690: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
96a0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
96b0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f  .** The first fo
96c0: 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rm is handled by
96d0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
96e0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  holding the list
96f0: 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76  .** of allowed v
9700: 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f  alues.  The seco
9710: 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74  nd form causes t
9720: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e  he SELECT to gen
9730: 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70  erate .** a temp
9740: 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a  orary table..*/.
9750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9760: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69  MIT_SUBQUERY.voi
9770: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  d sqlite3CodeSub
9780: 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
9790: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
97a0: 72 29 7b 0a 20 20 69 6e 74 20 6c 61 62 65 6c 20  r){.  int label 
97b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97d0: 41 64 64 72 65 73 73 20 61 66 74 65 72 20 73 75  Address after su
97e0: 62 2d 73 65 6c 65 63 74 20 63 6f 64 65 20 2a 2f  b-select code */
97f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
9800: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9810: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
9820: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
9830: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
9840: 20 76 61 72 69 61 62 6c 65 20 28 63 6f 72 72 65   variable (corre
9850: 6c 61 74 65 64 29 20 73 65 6c 65 63 74 2c 20 74  lated) select, t
9860: 68 65 6e 20 65 78 65 63 75 74 65 0a 20 20 2a 2a  hen execute.  **
9870: 20 69 74 20 6f 6e 6c 79 20 6f 6e 63 65 2e 20 55   it only once. U
9880: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 70 61  nless this is pa
9890: 72 74 20 6f 66 20 61 20 74 72 69 67 67 65 72 20  rt of a trigger 
98a0: 70 72 6f 67 72 61 6d 2e 20 49 6e 0a 20 20 2a 2a  program. In.  **
98b0: 20 74 68 61 74 20 63 61 73 65 20 72 65 2d 65 78   that case re-ex
98c0: 65 63 75 74 65 20 65 76 65 72 79 20 74 69 6d 65  ecute every time
98d0: 20 28 74 68 69 73 20 63 6f 75 6c 64 20 62 65 20   (this could be 
98e0: 6f 70 74 69 6d 69 7a 65 64 29 2e 0a 20 20 2a 2f  optimized)..  */
98f0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
9900: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
9910: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
9920: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
9930: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  Stack ){.    int
9940: 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e   mem = pParse->n
9950: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
9960: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9970: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20  P_MemLoad, mem, 
9980: 30 29 3b 0a 20 20 20 20 6c 61 62 65 6c 20 3d 20  0);.    label = 
9990: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
99a0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
99b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
99c0: 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 61 62 65 6c   OP_If, 0, label
99d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
99e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
99f0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
9a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9a10: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
9a20: 65 2c 20 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a  e, mem, 1);.  }.
9a30: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
9a40: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
9a50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9a60: 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50 75   OP_AggContextPu
9a70: 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  sh, 0, 0);.  }..
9a80: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9a90: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9aa0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63  TK_IN: {.      c
9ab0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
9ac0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49      KeyInfo keyI
9ad0: 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  nfo;.      int a
9ae0: 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ddr;        /* A
9af0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
9b00: 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74 69 6f  nTemp instructio
9b10: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
9b20: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
9b30: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
9b40: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
9b50: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
9b60: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
9b70: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
9b80: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
9b90: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
9ba0: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
9bb0: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
9bc0: 2e 20 41 20 74 65 6d 70 6f 72 61 72 79 20 74 61  . A temporary ta
9bd0: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
9be0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
9bf0: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
9c00: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
9c10: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
9c20: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
9c30: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
9c40: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
9c50: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
9c60: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
9c70: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
9c80: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
9c90: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
9ca0: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
9cb0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
9cc0: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
9cd0: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
9ce0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
9cf0: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
9d00: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
9d10: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
9d20: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
9d30: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
9d40: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
9d50: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
9d60: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
9d70: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
9d80: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
9d90: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
9da0: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
9db0: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
9dc0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
9dd0: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
9de0: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
9df0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
9e00: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
9e10: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
9e20: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
9e30: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
9e40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
9e50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
9e60: 70 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e  penTemp, pExpr->
9e70: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
9e80: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66    memset(&keyInf
9e90: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  o, 0, sizeof(key
9ea0: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65  Info));.      ke
9eb0: 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31  yInfo.nField = 1
9ec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9ee0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45  etNumColumns, pE
9ef0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b  xpr->iTable, 1);
9f00: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ..      if( pExp
9f10: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
9f20: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
9f30: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9f40: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
9f50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
9f60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
9f70: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
9f80: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
9f90: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
9fa0: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
9fb0: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
9fc0: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
9fd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9fe0: 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20      int iParm = 
9ff0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20  pExpr->iTable + 
a000: 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79   (((int)affinity
a010: 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20  )<<16);.        
a020: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
a030: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a040: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
a050: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
a060: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
a080: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
a090: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
a0a0: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
a0b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a0c0: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
a0d0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
a0e0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
a0f0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a100: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
a110: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
a120: 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79  Coll[0] = binary
a130: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
a140: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a150: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
a160: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
a170: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
a180: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
a190: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
a1a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
a1b0: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
a1c0: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
a1d0: 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65      **..** For e
a1e0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
a1f0: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
a200: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
a210: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
a220: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
a230: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
a240: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
a250: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
a260: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
a270: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
a280: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
a290: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
a2a0: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
a2b0: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
a2c0: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
a2d0: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
a2e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a2f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
a300: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
a310: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
a320: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
a330: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20  _NUMERIC;.      
a340: 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49    }.        keyI
a350: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70  nfo.aColl[0] = p
a360: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
a370: 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll;..        /* 
a380: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
a390: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
a3a0: 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
a3b0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
a3c0: 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  i<pExpr->pList->
a3d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
a3e0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
a3f0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
a400: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20  >a[i].pExpr;..  
a410: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
a420: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
a430: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
a440: 20 61 6e 64 20 76 61 6c 69 64 2e 20 2a 2f 0a 20   and valid. */. 
a450: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
a460: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a470: 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20  ant(pE2) ){.    
a480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
a4b0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
a4c0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75  f IN operator mu
a4d0: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 29  st be constant")
a4e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
a4f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
a500: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
a510: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
a520: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
a530: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
a540: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
a550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a560: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a570: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
a580: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a590: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a5a0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
a5b0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
a5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a5d0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a5e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
a5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a600: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
a610: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
a620: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
a630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a640: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
a650: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
a660: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
a670: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
a680: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a690: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
a6a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
a6b0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
a6c0: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
a6d0: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
a6e0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a6f0: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
a700: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
a710: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
a720: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
a730: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
a740: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
a750: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
a760: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
a770: 20 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a 20        int sop;. 
a780: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
a790: 6c 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d  l;..      pExpr-
a7a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73  >iColumn = pPars
a7b0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
a7c0: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70   pSel = pExpr->p
a7d0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
a7e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a7f0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
a800: 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b    sop = SRT_Mem;
a810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a820: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
a830: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
a840: 20 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20   "1", 0, 1 };.  
a850: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
a860: 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20  Exists;.        
a870: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a880: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
a890: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  st);.        pSe
a8a0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
a8b0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a8c0: 64 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(0, .          
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
a8f0: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f  NTEGER, 0, 0, &o
a900: 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ne), 0);.      }
a910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
a920: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
a930: 6c 2c 20 73 6f 70 2c 20 70 45 78 70 72 2d 3e 69  l, sop, pExpr->i
a940: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 2c  Column, 0, 0, 0,
a950: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
a960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
a970: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
a980: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
a990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a9a0: 41 67 67 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  AggContextPop, 0
a9b0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
a9c0: 6c 61 62 65 6c 3c 30 20 29 7b 0a 20 20 20 20 73  label<0 ){.    s
a9d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
a9e0: 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 29  eLabel(v, label)
a9f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
aa00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
aa10: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
aa20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
aa30: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
aa40: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
aa50: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
aa60: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
aa70: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
aa80: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
aa90: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
aaa0: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
aab0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
aac0: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
aad0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
aae0: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
aaf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab00: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ab10: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
ab20: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
ab30: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
ab40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ab50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ab60: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
ab70: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
ab80: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
ab90: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  eal, 0, 0, z, n)
aba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
abb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
abc0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
abd0: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
abe0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
abf0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
ac00: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
ac10: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
ac20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
ac30: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
ac40: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
ac50: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
ac60: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
ac70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
ac80: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
ac90: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
aca0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
acb0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
acc0: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
acd0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
ace0: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
acf0: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
ad00: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
ad10: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
ad20: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
ad30: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
ad40: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
ad50: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
ad60: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
ad70: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
ad80: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
ad90: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
ada0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
adb0: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
adc0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
add0: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
ade0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
adf0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
ae00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
ae10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ae20: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 20 20  tring8, 0, 0);  
ae30: 2f 2a 20 45 6d 70 74 79 20 65 78 70 72 65 73 73  /* Empty express
ae40: 69 6f 6e 20 65 76 61 6c 73 20 74 6f 20 4e 55 4c  ion evals to NUL
ae50: 4c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  L */.    return;
ae60: 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70  .  }.  op = pExp
ae70: 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
ae80: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
ae90: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
aea0: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
aeb0: 66 69 6c 6c 41 67 67 20 26 26 20 70 45 78 70 72  fillAgg && pExpr
aec0: 2d 3e 69 41 67 67 3e 3d 30 20 29 7b 0a 20 20 20  ->iAgg>=0 ){.   
aed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aee0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47  AddOp(v, OP_AggG
aef0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 43  et, pExpr->iAggC
af00: 74 78 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29  tx, pExpr->iAgg)
af10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
af20: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
af30: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
af40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
af50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45  v, OP_Column, pE
af60: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
af70: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
af80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
af90: 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 45  umnDefault(v, pE
afa0: 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72  xpr->pTab, pExpr
afb0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
afc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
afd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
afe0: 70 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70  p(v, OP_Recno, p
aff0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
b000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b020: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
b030: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
b040: 74 65 67 65 72 28 76 2c 20 70 45 78 70 72 2d 3e  teger(v, pExpr->
b050: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
b060: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
b070: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b080: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
b090: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
b0a0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  NG: {.      asse
b0b0: 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50  rt( TK_FLOAT==OP
b0c0: 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61  _Real );.      a
b0d0: 73 73 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47  ssert( TK_STRING
b0e0: 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a  ==OP_String8 );.
b0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b100: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
b110: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
b120: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
b130: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b140: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
b150: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
b160: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
b170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
b180: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
b190: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
b1a0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
b1b0: 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20  LOB==OP_HexBlob 
b1c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b1d0: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
b1e0: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  , 0, pExpr->toke
b1f0: 6e 2e 7a 2b 31 2c 20 70 45 78 70 72 2d 3e 74 6f  n.z+1, pExpr->to
b200: 6b 65 6e 2e 6e 2d 31 29 3b 0a 20 20 20 20 20 20  ken.n-1);.      
b210: 73 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f  sqlite3VdbeDequo
b220: 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20  teP3(v, -1);.   
b230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b240: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b250: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
b260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b270: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
b280: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
b290: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b2a0: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
b2b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b2c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b2d0: 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
b2e0: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
b2f0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
b300: 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20  ken.n>1 ){.     
b310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
b320: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 45  angeP3(v, -1, pE
b330: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
b340: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
b350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
b360: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b370: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
b380: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b390: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b3a0: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
b3b0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
b3c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b3d0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
b3e0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
b3f0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
b400: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
b410: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
b420: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
b430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b440: 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
b450: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
b460: 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
b470: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
b480: 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
b490: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
b4a0: 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
b4b0: 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
b4c0: 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
b4d0: 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
b4e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
b4f0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b500: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
b510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b520: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b530: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
b540: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
b550: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b560: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
b570: 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  ight, op, 0, 0);
b580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b590: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b5a0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
b5b0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
b5c0: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
b5d0: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
b5e0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
b5f0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
b600: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
b610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
b620: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
b630: 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
b640: 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
b650: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
b660: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
b670: 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
b680: 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
b690: 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
b6a0: 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
b6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b6c0: 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
b6d0: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
b6e0: 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
b6f0: 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20  Subtract );.    
b700: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
b710: 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
b720: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b730: 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
b740: 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  tAnd );.      as
b750: 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
b760: 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20  OP_BitOr );.    
b770: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
b780: 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
b790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b7a0: 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
b7b0: 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  ftLeft );.      
b7c0: 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
b7d0: 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
b7e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b7f0: 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
b800: 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20  Concat );.      
b810: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b820: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b830: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
b840: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b850: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
b860: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
b870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
b880: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b890: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b8a0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
b8b0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
b8c0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
b8d0: 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
b8e0: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
b8f0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
b900: 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65  =TK_FLOAT || pLe
b910: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
b920: 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f  ER ){.        To
b930: 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d  ken *p = &pLeft-
b940: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
b950: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
b960: 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b 20 32  Malloc( p->n + 2
b970: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69   );.        spri
b980: 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20  ntf(z, "-%.*s", 
b990: 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20  p->n, p->z);.   
b9a0: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
b9b0: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
b9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b9d0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
b9e0: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d  eal, 0, 0, z, p-
b9f0: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  >n+1);.        }
ba00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ba10: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 7a  codeInteger(v, z
ba20: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
ba30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ba40: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
ba50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ba60: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
ba70: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b   through into TK
ba80: 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _NOT */.    }.  
ba90: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
baa0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
bab0: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
bac0: 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
bad0: 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
bae0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
baf0: 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
bb00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bb10: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bb20: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
bb30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bb40: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
bb50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bb60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
bb70: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
bb80: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
bb90: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
bba0: 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
bbb0: 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
bbc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bbd0: 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
bbe0: 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
bbf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bc00: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
bc10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
bc20: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
bc30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bc40: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20  );.      dest = 
bc50: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
bc60: 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc80: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
bc90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
bca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bcb0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
bcc0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
bcd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bce0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
bcf0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
bd00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bd10: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
bd20: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
bd30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bd40: 63 61 73 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20  case TK_CDATE:. 
bd50: 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45     case TK_CTIME
bd60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54  :.    case TK_CT
bd70: 49 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63 61  IMESTAMP:.    ca
bd80: 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20  se TK_GLOB:.    
bd90: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20  case TK_LIKE:.  
bda0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
bdb0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
bdc0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
bdd0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
bde0: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
bdf0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
be00: 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
be10: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
be20: 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
be30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
be40: 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20  d;.      int p2 
be50: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
be60: 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  ;.      u8 enc =
be70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
be80: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
be90: 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
bea0: 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d    getFunctionNam
beb0: 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26  e(pExpr, &zId, &
bec0: 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  nId);.      pDef
bed0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
bee0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
bef0: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78  b, zId, nId, nEx
bf00: 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  pr, enc, 0);.   
bf10: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
bf20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  =0 );.      nExp
bf30: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
bf40: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
bf50: 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  se, pList);.    
bf60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
bf70: 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
bf80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
bf90: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
bfa0: 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
bfb0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
bfc0: 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29      p2 |= (1<<i)
bfd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bfe0: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
bff0: 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43  edCollSeq && !pC
c000: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
c010: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c020: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c030: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
c040: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
c050: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
c060: 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f  if( pDef->needCo
c070: 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20  llSeq ){.       
c080: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
c090: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
c0a0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20  ->pDfltColl; .  
c0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c0c0: 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  eOp3(v, OP_CollS
c0d0: 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  eq, 0, 0, (char 
c0e0: 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c  *)pColl, P3_COLL
c0f0: 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
c100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
c110: 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p3(v, OP_Functio
c120: 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20 28 63  n, nExpr, p2, (c
c130: 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55  har*)pDef, P3_FU
c140: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 62 72  NCDEF);.      br
c150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
c160: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c170: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
c180: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
c190: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
c1a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
c1b0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
c1c0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
c1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c1e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
c1f0: 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  d, pExpr->iColum
c200: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 0);.      Vdb
c210: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
c220: 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65  load subquery re
c230: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62  sult"));.      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c250: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
c260: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c270: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
c280: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
c290: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
c2a0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20  arse, pExpr);.. 
c2b0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
c2c0: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
c2d0: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
c2e0: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
c2f0: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
c300: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
c310: 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
c320: 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
c330: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
c340: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20  for.      ** P3 
c350: 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
c360: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c370: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
c380: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
c390: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71  Expr);..      sq
c3a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c3b0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
c3c0: 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43   0);..      /* C
c3d0: 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66  ode the <expr> f
c3e0: 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
c3f0: 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f  ...)". The tempo
c400: 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20  rary table.     
c410: 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   ** pExpr->iTabl
c420: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  e contains the v
c430: 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
c440: 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74  up the (...) set
c450: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c460: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c470: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c480: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64  pLeft);.      ad
c490: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c4a0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
c4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
c4d0: 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34  Null, -1, addr+4
c4e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
c4f0: 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20   addr + 0 */.   
c500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c510: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
c520: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c540: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
c550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c570: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29  Goto, 0, addr+7)
c580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c590: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
c5a0: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
c5b0: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20  affinity, 1);   
c5c0: 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20  /* addr + 4 */. 
c5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e  AddOp(v, OP_Foun
c5f0: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
c600: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
c610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c620: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
c630: 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20  -1, 0);         
c640: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
c650: 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62   + 6 */..      b
c660: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
c670: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  if.    case TK_B
c680: 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
c690: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
c6a0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
c6b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c6c0: 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
c6d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
c6e0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
c6f0: 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
c700: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
c710: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c720: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
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 30 2c  Op(v, OP_Dup, 0,
c750: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c760: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c770: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
c780: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
c790: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
c7a0: 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30  ght, OP_Ge, 0, 0
c7b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c7c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7d0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
c7e0: 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
c7f0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
c800: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
c810: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c820: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
c830: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
c840: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
c850: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
c860: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
c870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c880: 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29  v, OP_And, 0, 0)
c890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c8a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c8b0: 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  _UPLUS:.    case
c8c0: 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
c8d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c8e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c8f0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Left);.      bre
c900: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c910: 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20  se TK_CASE: {.  
c920: 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64      int expr_end
c930: 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e  _label;.      in
c940: 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20  t jumpInst;.    
c950: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
c960: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20    int nExpr;.   
c970: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c980: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c990: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
c9a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
c9b0: 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20  istelem;..      
c9c0: 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
c9d0: 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ist);.      asse
c9e0: 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt((pExpr->pList
c9f0: 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
ca00: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
ca10: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
ca20: 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
ca30: 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
ca40: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  >pList;.      aL
ca50: 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
ca60: 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
ca70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
ca80: 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64  ;.      expr_end
ca90: 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  _label = sqlite3
caa0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
cab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
cac0: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
cad0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cae0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
caf0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
cb00: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
cb10: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32  ; i<nExpr; i=i+2
cb20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cb30: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cb40: 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e  e, aListelem[i].
cb50: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
cb60: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
cb70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
cb80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cb90: 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b  , OP_Dup, 1, 1);
cba0: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
cbb0: 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  nst = codeCompar
cbc0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
cbd0: 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65  >pLeft, aListele
cbe0: 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20  m[i].pExpr,.    
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
cc10: 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  Ne, 0, 1);.     
cc20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cc30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
cc40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
cc50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cc60: 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69   jumpInst = sqli
cc70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cc80: 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b  OP_IfNot, 1, 0);
cc90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cca0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ccb0: 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
ccc0: 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29  elem[i+1].pExpr)
ccd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cce0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ccf0: 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65  _Goto, 0, expr_e
cd00: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
cd10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cd20: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
cd30: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
cd40: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
cd50: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64  (v, jumpInst, ad
cd60: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
cd70: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
cd80: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
cd90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cda0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
cdb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cdc0: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
cdd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
cde0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
cdf0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
ce00: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
ce10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ce20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ce30: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
ce40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ce50: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ce60: 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65  eLabel(v, expr_e
ce70: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
ce80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
ce90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cea0: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
ceb0: 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
cec0: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
ced0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
cee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
cef0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
cf20: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
cf30: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
cf40: 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74  -program");..ret
cf50: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
cf60: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
cf70: 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65  olumn!=OE_Ignore
cf80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
cf90: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
cfa0: 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  umn==OE_Rollback
cfb0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
cfc0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
cfd0: 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
cfe0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
cff0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
d000: 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b  mn == OE_Fail );
d010: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
d020: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48  3VdbeOp3(v, OP_H
d030: 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
d040: 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69  TRAINT, pExpr->i
d050: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
d080: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
d090: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
d0a0: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  3VdbeDequoteP3(v
d0b0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  , -1);.      } e
d0c0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
d0d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
d0e0: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
d0f0: 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
d100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d110: 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
d120: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
d130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d140: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d150: 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
d160: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
d170: 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
d180: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61  omment((v, "# ra
d190: 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
d1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
d1b0: 6e 64 69 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a  ndif.    break;.
d1c0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
d1d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
d1e0: 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ER./*.** Generat
d1f0: 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
d200: 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
d210: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
d220: 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  aves the result.
d230: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
d240: 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
d250: 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a  e3ExprCode()..**
d260: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d270: 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68   might also cach
d280: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  e the result and
d290: 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70   modify the pExp
d2a0: 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61  r tree.** so tha
d2b0: 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  t it will make u
d2c0: 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64  se of the cached
d2d0: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
d2e0: 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e  quent evaluation
d2f0: 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  s.** rather than
d300: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68   evaluate the wh
d310: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ole expression a
d320: 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65  gain.  Trivial e
d330: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
d340: 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49  * not cached.  I
d350: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d360: 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20   is cached, its 
d370: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
d380: 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79   in a .** memory
d390: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   location..*/.vo
d3a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
d3b0: 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
d3c0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
d3d0: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
d3e0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d3f0: 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  e;.  int iMem;. 
d400: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
d410: 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  2;.  if( v==0 ) 
d420: 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20  return;.  addr1 
d430: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d440: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
d450: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d460: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
d470: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
d480: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d490: 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e  v);.  if( addr2>
d4a0: 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74  addr1+1 || sqlit
d4b0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
d4c0: 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ddr1)->opcode==O
d4d0: 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
d4e0: 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e    iMem = pExpr->
d4f0: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
d500: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
d510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d520: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
d530: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70  em, 0);.    pExp
d540: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
d550: 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
d560: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
d570: 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
d580: 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
d590: 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
d5a0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
d5b0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
d5c0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
d5d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
d5e0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
d5f0: 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
d600: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  e stack..*/.int 
d610: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
d620: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
d630: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
d640: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d650: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d660: 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
d670: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
d680: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29  to be coded */.)
d690: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
d6a0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d6b0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56  .  int i, n;.  V
d6c0: 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c  dbe *v;.  if( pL
d6d0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
d6e0: 30 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  0;.  v = sqlite3
d6f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d700: 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
d710: 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
d720: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
d730: 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  i<n; i++, pItem+
d740: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
d750: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d760: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
d770: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
d780: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d790: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
d7a0: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
d7b0: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
d7c0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
d7d0: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
d7e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d7f0: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
d800: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
d810: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
d820: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
d830: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
d840: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
d850: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
d860: 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
d870: 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
d880: 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
d890: 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
d8a0: 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
d8b0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s true..**.** Th
d8c0: 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
d8d0: 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
d8e0: 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
d8f0: 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
d900: 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
d910: 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
d920: 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
d930: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
d940: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
d950: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
d960: 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
d970: 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
d980: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
d990: 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
d9a0: 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
d9b0: 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
d9c0: 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
d9d0: 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
d9e0: 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
d9f0: 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
da00: 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
da10: 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
da20: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
da30: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
da40: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
da50: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
da60: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
da70: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
da80: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
da90: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
daa0: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
dab0: 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  urn;.  op = pExp
dac0: 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
dad0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
dae0: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
daf0: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
db00: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
db10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
db20: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
db30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
db40: 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
db50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db60: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
db70: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
db80: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
db90: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
dba0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dbb0: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
dbc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dbd0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
dbe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dbf0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
dc00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
dc10: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
dc20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
dc30: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
dc40: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
dc50: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
dc60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dc70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
dc80: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
dc90: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
dca0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
dcb0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
dcc0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
dcd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dce0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
dcf0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
dd00: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
dd10: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
dd20: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
dd30: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
dd40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
dd50: 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
dd60: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
dd70: 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
dd80: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
dd90: 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
dda0: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
ddb0: 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
ddc0: 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
ddd0: 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
dde0: 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
ddf0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
de00: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
de10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
de20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
de30: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
de40: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
de50: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
de60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
de70: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
de80: 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20  ight, op, dest, 
de90: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
dea0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
deb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
dec0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
ded0: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
dee0: 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
def0: 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
df00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
df10: 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
df20: 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
df30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
df40: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
df50: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
df60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
df70: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
df80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
df90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
dfa0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
dfb0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
dfc0: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
dfd0: 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   z" is implement
dfe0: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
dff0: 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
e000: 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20   < y) GOTO 3.   
e010: 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d     ** 2 IF (x <=
e020: 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a   z) GOTO <dest>.
e030: 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20        ** 3 .... 
e040: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
e050: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
e060: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
e070: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
e080: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
e090: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
e0a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
e0b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e0c0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
e0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e0e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
e0f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e100: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e110: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
e120: 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65       addr = code
e130: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
e140: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
e150: 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66  P_Lt, 0, !jumpIf
e160: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52  Null);..      pR
e170: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
e180: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
e190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e1a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e1b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
e1c0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
e1d0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
e1e0: 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75   OP_Le, dest, ju
e1f0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
e200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e210: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
e220: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e230: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e240: 50 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69  P2(v, addr, sqli
e250: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e260: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 73 71  dr(v));.      sq
e270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e280: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
e290: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e2a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
e2b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
e2c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e2d0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
e2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e2f0: 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66  v, OP_If, jumpIf
e300: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
e310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e320: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
e330: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
e340: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
e350: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
e360: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
e370: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
e380: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
e390: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
e3a0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
e3b0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
e3c0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
e3d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
e3e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
e3f0: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
e400: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
e410: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
e420: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
e430: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
e440: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
e450: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
e460: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
e470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e480: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
e490: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
e4a0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
e4b0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
e4c0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
e4d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
e4e0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
e4f0: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
e500: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
e510: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
e520: 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
e530: 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
e540: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
e550: 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
e560: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
e570: 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
e580: 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
e590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
e5a0: 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
e5b0: 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
e5c0: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
e5d0: 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
e5e0: 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
e5f0: 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
e600: 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
e610: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e630: 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
e640: 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
e650: 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
e660: 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
e670: 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
e680: 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
e690: 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
e6a0: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e6c0: 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
e6d0: 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
e6e0: 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
e6f0: 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
e700: 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
e710: 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
e720: 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
e730: 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
e740: 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
e750: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
e760: 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
e770: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
e780: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
e790: 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
e7a0: 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
e7b0: 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
e7c0: 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
e7d0: 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
e7e0: 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
e7f0: 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
e800: 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
e810: 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
e820: 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
e830: 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
e840: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e850: 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
e860: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
e870: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e880: 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
e890: 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
e8a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e8b0: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
e8c0: 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
e8d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e8e0: 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
e8f0: 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
e900: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
e910: 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
e920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
e930: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
e940: 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
e950: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e960: 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
e970: 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
e980: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
e990: 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
e9a0: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
e9b0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e9c0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
e9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e9e0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
e9f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
ea00: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ea10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ea20: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
ea30: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
ea40: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
ea50: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
ea60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ea70: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
ea80: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
ea90: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
eaa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
eab0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
eac0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
ead0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
eae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
eaf0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
eb00: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
eb10: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
eb20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
eb30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
eb40: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
eb50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
eb60: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
eb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
eb80: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
eb90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
eba0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ebb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ebc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ebd0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
ebe0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
ebf0: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
ec00: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
ec10: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
ec20: 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
ec30: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ec40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ec50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec60: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ec70: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
ec80: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
ec90: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
eca0: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
ecb0: 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
ecc0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
ecd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ece0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
ecf0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
ed00: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
ed10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ed20: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
ed30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
ed40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed50: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
ed60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ed70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ed80: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
ed90: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
eda0: 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45  ion is "x BETWEE
edb0: 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69  N y AND z". It i
edc0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
edd0: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
ede0: 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79   ** 1 IF (x >= y
edf0: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
ee00: 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a  * 2 GOTO <dest>.
ee10: 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78        ** 3 IF (x
ee20: 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74   > z) GOTO <dest
ee30: 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  >.      */.     
ee40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
ee50: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
ee60: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
ee70: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
ee80: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
ee90: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
eea0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
eeb0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
eec0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
eed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
eee0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
eef0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ef00: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
ef10: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
ef20: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
ef30: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
ef40: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
ef50: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
ef60: 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33  t, OP_Ge, addr+3
ef70: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
ef80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
efa0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
efb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
efc0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
efd0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
efe0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
eff0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
f000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f010: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
f020: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
f030: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
f040: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
f050: 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Gt, dest, jum
f060: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
f070: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f080: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
f090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f0a0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
f0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f0c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f0d0: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
f0e0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
f0f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f100: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
f110: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
f120: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
f130: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
f140: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
f150: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
f160: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
f170: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
f180: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
f190: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
f1a0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
f1b0: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
f1c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f1d0: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
f1e0: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
f1f0: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
f200: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
f210: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
f220: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
f230: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
f240: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
f250: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
f260: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
f270: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
f280: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
f290: 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
f2a0: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
f2b0: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
f2c0: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
f2d0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
f2e0: 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
f2f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
f300: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
f310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
f320: 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
f330: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f340: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
f350: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
f360: 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
f370: 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
f380: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
f390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
f3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f3b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
f3c0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
f3d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
f3e0: 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
f3f0: 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
f400: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
f410: 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
f420: 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
f430: 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
f440: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
f450: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
f460: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
f470: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
f480: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
f490: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
f4a0: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
f4b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f4c0: 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  3StrNICmp(pA->to
f4d0: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
f4e0: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pB->token.n)
f4f0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
f500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
f510: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
f520: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
f530: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
f540: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
f550: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2a 20  n its index..** 
f560: 54 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  The new element 
f570: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
f580: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 63 61 6c  o zero.  The cal
f590: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
f5a0: 0a 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20  .** expected to 
f5b0: 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2f 0a 73  fill it in..*/.s
f5c0: 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64  tatic int append
f5d0: 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  AggInfo(Parse *p
f5e0: 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28 70  Parse){.  if( (p
f5f0: 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30 78  Parse->nAgg & 0x
f600: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  7)==0 ){.    int
f610: 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e   amt = pParse->n
f620: 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67 67  Agg + 8;.    Agg
f630: 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71 6c  Expr *aAgg = sql
f640: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
f650: 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a  e->aAgg, amt*siz
f660: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67  eof(pParse->aAgg
f670: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
f680: 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Agg==0 ){.      
f690: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
f6a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67  .    pParse->aAg
f6b0: 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20  g = aAgg;.  }.  
f6c0: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
f6d0: 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67  aAgg[pParse->nAg
f6e0: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  g], 0, sizeof(pP
f6f0: 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b  arse->aAgg[0]));
f700: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
f710: 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nAgg++;.}../*.
f720: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46  ** This is an xF
f730: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
f740: 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69  Tree() used to i
f750: 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c  mplement .** sql
f760: 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
f770: 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
f780: 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
f790: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
f7a0: 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
f7b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
f7c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f7d0: 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67   analyzes the ag
f7e0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
f7f0: 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74   at pExpr..*/.st
f800: 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
f810: 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a  Aggregate(void *
f820: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
f830: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41  r){.  int i;.  A
f840: 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20  ggExpr *aAgg;.  
f850: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
f860: 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20   = (NameContext 
f870: 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
f880: 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
f890: 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
f8a0: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
f8b0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 73  ->pSrcList;..  s
f8c0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
f8d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f8e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
f8f0: 66 6f 72 28 69 3d 30 3b 20 70 53 72 63 4c 69 73  for(i=0; pSrcLis
f900: 74 20 26 26 20 69 3c 70 53 72 63 4c 69 73 74 2d  t && i<pSrcList-
f910: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
f920: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
f930: 69 54 61 62 6c 65 3d 3d 70 53 72 63 4c 69 73 74  iTable==pSrcList
f940: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
f950: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 41 67 67  {.          aAgg
f960: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
f970: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
f980: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
f990: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
f9a0: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
f9b0: 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e  ].isAgg ) contin
f9c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
f9d0: 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70  if( aAgg[i].pExp
f9e0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  r->iTable==pExpr
f9f0: 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20  ->iTable.       
fa00: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
fa10: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
fa20: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
fa30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
fa40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fa50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fa60: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
fa70: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
fa80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
fa90: 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f   = appendAggInfo
faa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
fab0: 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
fac0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
fad0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
fae0: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b  gg[i].isAgg = 0;
faf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
fb00: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
fb10: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
fb20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fb30: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
fb40: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  i;.          pEx
fb50: 70 72 2d 3e 69 41 67 67 43 74 78 20 3d 20 70 4e  pr->iAggCtx = pN
fb60: 43 2d 3e 6e 44 65 70 74 68 3b 0a 20 20 20 20 20  C->nDepth;.     
fb70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
fb80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fb90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
fba0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fbb0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
fbc0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43   {.      if( pNC
fbd0: 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
fbe0: 20 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50         aAgg = pP
fbf0: 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20  arse->aAgg;.    
fc00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fc10: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
fc20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
fc30: 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20   !aAgg[i].isAgg 
fc40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fc50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
fc60: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  3ExprCompare(aAg
fc70: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
fc80: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
fc90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
fcb0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50         if( i>=pP
fcc0: 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20  arse->nAgg ){.  
fcd0: 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
fce0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
fcf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
fd00: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
fd10: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
fd20: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
fd30: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n 1;.          p
fd40: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
fd50: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
fd60: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
fd70: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [i].pExpr = pExp
fd80: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  r;.          pPa
fd90: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
fda0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
fdb0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
fdc0: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
fdd0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
fde0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
fdf0: 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .n,.            
fe00: 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
fe10: 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
fe20: 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
fe30: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
fe40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
fe50: 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 72  g = i;.        r
fe60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
fe70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fe80: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
fe90: 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
fea0: 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65  th++;.    walkSe
feb0: 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e  lectExpr(pExpr->
fec0: 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65  pSelect, analyze
fed0: 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
fee0: 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
fef0: 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
ff00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
ff10: 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
ff20: 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
ff30: 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
ff40: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
ff50: 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
ff60: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
ff70: 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
ff80: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
ff90: 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
ffa0: 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
ffb0: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
ffc0: 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
ffd0: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
ffe0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
fff0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
10000 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
10010 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
10020 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
10030 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
10040 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ames()..**.** If
10050 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
10060 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
10070 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
10080 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
10090 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
100a0 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
100b0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
100c0 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
100d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
100e0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
100f0 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50  t nErr = pNC->pP
10100 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61  arse->nErr;.  wa
10110 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
10120 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
10130 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75  te, pNC);.  retu
10140 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  rn pNC->pParse->
10150 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a  nErr - nErr;.}..
10160 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75  /*.** Locate a u
10170 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 67 69 76  ser function giv
10180 65 6e 20 61 20 6e 61 6d 65 2c 20 61 20 6e 75 6d  en a name, a num
10190 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
101a0 20 61 6e 64 20 61 20 66 6c 61 67 0a 2a 2a 20 69   and a flag.** i
101b0 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
101c0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  r the function p
101d0 72 65 66 65 72 73 20 55 54 46 2d 31 36 20 6f 76  refers UTF-16 ov
101e0 65 72 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72  er UTF-8.  Retur
101f0 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
10200 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  o the FuncDef st
10210 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
10220 69 6e 65 73 20 74 68 61 74 20 66 75 6e 63 74 69  ines that functi
10230 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e 0a 2a 2a  on, or return.**
10240 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75 6e   NULL if the fun
10250 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
10260 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xist..**.** If t
10270 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61 72  he createFlag ar
10280 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
10290 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e  then a new (blan
102a0 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74  k) FuncDef.** st
102b0 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
102c0 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74  ed and liked int
102d0 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75 63  o the "db" struc
102e0 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20  ture if a.** no 
102f0 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69 6f  matching functio
10300 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  n previously exi
10310 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65 61  sted.  When crea
10320 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a 2a  teFlag is true.*
10330 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20 70  * and the nArg p
10340 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c 20  arameter is -1, 
10350 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63  then only a func
10360 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70 74  tion that accept
10370 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20  s.** any number 
10380 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c  of arguments wil
10390 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  l be returned..*
103a0 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c  *.** If createFl
103b0 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
103c0 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65 6e  nArg is -1, then
103d0 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69 64   the first valid
103e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75  .** function fou
103f0 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  nd is returned. 
10400 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 76   A function is v
10410 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20 78  alid if either x
10420 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70  Func.** or xStep
10430 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a   is non-zero..**
10440 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61  .** If createFla
10450 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  g is false, then
10460 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
10470 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 61   the required na
10480 6d 65 20 61 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72  me and.** number
10490 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 61   of arguments ma
104a0 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 65 76  y be returned ev
104b0 65 6e 20 69 66 20 74 68 65 20 65 54 65 78 74 52  en if the eTextR
104c0 65 70 20 66 6c 61 67 20 64 6f 65 73 20 6e 6f 74  ep flag does not
104d0 0a 2a 2a 20 6d 61 74 63 68 20 74 68 61 74 20 72  .** match that r
104e0 65 71 75 65 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e  equested..*/.Fun
104f0 63 44 65 66 20 2a 73 71 6c 69 74 65 33 46 69 6e  cDef *sqlite3Fin
10500 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  dFunction(.  sql
10510 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10520 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
10530 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
10540 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e  har *zName, /* N
10550 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
10560 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74  ion.  Not null-t
10570 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69  erminated */.  i
10580 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20  nt nName,       
10590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
105a0 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
105b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
105c0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Arg,          /*
105d0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
105e0 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20  ents.  -1 means 
105f0 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  any number */.  
10600 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20  u8 enc,         
10610 20 20 20 2f 2a 20 50 72 65 66 65 72 72 65 64 20     /* Preferred 
10620 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  text encoding */
10630 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61  .  int createFla
10640 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  g     /* Create 
10650 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72 75  new entry if tru
10660 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f  e and does not o
10670 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20 2a  therwise exist *
10680 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  /.){.  FuncDef *
10690 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  p;         /* It
106a0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
106b0 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46  */.  FuncDef *pF
106c0 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
106d0 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
106e0 74 68 69 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 46  this name */.  F
106f0 75 6e 63 44 65 66 20 2a 70 42 65 73 74 20 3d 20  uncDef *pBest = 
10700 30 3b 20 2f 2a 20 42 65 73 74 20 6d 61 74 63 68  0; /* Best match
10710 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
10720 0a 20 20 69 6e 74 20 62 65 73 74 6d 61 74 63 68  .  int bestmatch
10730 20 3d 20 30 3b 20 20 0a 0a 0a 20 20 61 73 73 65   = 0;  ...  asse
10740 72 74 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  rt( enc==SQLITE_
10750 55 54 46 38 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c  UTF8 || enc==SQL
10760 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 65  ITE_UTF16LE || e
10770 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
10780 42 45 20 29 3b 0a 20 20 69 66 28 20 6e 41 72 67  BE );.  if( nArg
10790 3c 2d 31 20 29 20 6e 41 72 67 20 3d 20 2d 31 3b  <-1 ) nArg = -1;
107a0 0a 0a 20 20 70 46 69 72 73 74 20 3d 20 28 46 75  ..  pFirst = (Fu
107b0 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 33 48 61  ncDef*)sqlite3Ha
107c0 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e  shFind(&db->aFun
107d0 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  c, zName, nName)
107e0 3b 0a 20 20 66 6f 72 28 70 3d 70 46 69 72 73 74  ;.  for(p=pFirst
107f0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
10800 7b 0a 20 20 20 20 2f 2a 20 44 75 72 69 6e 67 20  {.    /* During 
10810 74 68 65 20 73 65 61 72 63 68 20 66 6f 72 20 74  the search for t
10820 68 65 20 62 65 73 74 20 66 75 6e 63 74 69 6f 6e  he best function
10830 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 62 65 73   definition, bes
10840 74 6d 61 74 63 68 20 69 73 20 73 65 74 0a 20 20  tmatch is set.  
10850 20 20 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 20    ** as follows 
10860 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
10870 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 6d  quality of the m
10880 61 74 63 68 20 77 69 74 68 20 74 68 65 20 64 65  atch with the de
10890 66 69 6e 69 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  finition.    ** 
108a0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 42  pointed to by pB
108b0 65 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  est:.    **.    
108c0 2a 2a 20 30 3a 20 70 42 65 73 74 20 69 73 20 4e  ** 0: pBest is N
108d0 55 4c 4c 2e 20 4e 6f 20 6d 61 74 63 68 20 68 61  ULL. No match ha
108e0 73 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 20 20  s been found..  
108f0 20 20 2a 2a 20 31 3a 20 41 20 76 61 72 69 61 62    ** 1: A variab
10900 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e  le arguments fun
10910 63 74 69 6f 6e 20 74 68 61 74 20 70 72 65 66 65  ction that prefe
10920 72 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20  rs UTF-8 when a 
10930 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a 20 20 20  UTF-16.    **   
10940 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71   encoding is req
10950 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
10960 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 32 3a  versa..    ** 2:
10970 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75   A variable argu
10980 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 74  ments function t
10990 68 61 74 20 75 73 65 73 20 55 54 46 2d 31 36 42  hat uses UTF-16B
109a0 45 20 77 68 65 6e 20 55 54 46 2d 31 36 4c 45 20  E when UTF-16LE 
109b0 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 72 65 71  is.    **    req
109c0 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
109d0 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 33 3a  versa..    ** 3:
109e0 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75   A variable argu
109f0 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 75  ments function u
10a00 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 65  sing the same te
10a10 78 74 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 20  xt encoding..   
10a20 20 2a 2a 20 34 3a 20 41 20 66 75 6e 63 74 69 6f   ** 4: A functio
10a30 6e 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74  n with the exact
10a40 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
10a50 65 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74  ents requested t
10a60 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72  hat.    **    pr
10a70 65 66 65 72 73 20 55 54 46 2d 38 20 77 68 65 6e  efers UTF-8 when
10a80 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69   a UTF-16 encodi
10a90 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ng is requested,
10aa0 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
10ab0 20 20 20 20 2a 2a 20 35 3a 20 41 20 66 75 6e 63      ** 5: A func
10ac0 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65 78  tion with the ex
10ad0 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  act number of ar
10ae0 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73 74 65  guments requeste
10af0 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20  d that.    **   
10b00 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 4c   prefers UTF-16L
10b10 45 20 77 68 65 6e 20 55 54 46 2d 31 36 42 45 20  E when UTF-16BE 
10b20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72  is requested, or
10b30 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20   vice versa..   
10b40 20 2a 2a 20 36 3a 20 41 6e 20 65 78 61 63 74 20   ** 6: An exact 
10b50 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20  match..    **.  
10b60 20 20 2a 2a 20 41 20 6c 61 72 67 65 72 20 76 61    ** A larger va
10b70 6c 75 65 20 6f 66 20 27 6d 61 74 63 68 71 75 61  lue of 'matchqua
10b80 6c 27 20 69 6e 64 69 63 61 74 65 73 20 61 20 6d  l' indicates a m
10b90 6f 72 65 20 64 65 73 69 72 61 62 6c 65 20 6d 61  ore desirable ma
10ba0 74 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tch..    */.    
10bb0 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20  if( p->nArg==-1 
10bc0 7c 7c 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  || p->nArg==nArg
10bd0 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a   || nArg==-1 ){.
10be0 20 20 20 20 20 20 69 6e 74 20 6d 61 74 63 68 20        int match 
10bf0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
10c00 20 51 75 61 6c 69 74 79 20 6f 66 20 74 68 69 73   Quality of this
10c10 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
10c20 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72  if( p->nArg==nAr
10c30 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b  g || nArg==-1 ){
10c40 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d  .        match =
10c50 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   4;.      }.    
10c60 20 20 69 66 28 20 65 6e 63 3d 3d 70 2d 3e 69 50    if( enc==p->iP
10c70 72 65 66 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  refEnc ){.      
10c80 20 20 6d 61 74 63 68 20 2b 3d 20 32 3b 0a 20 20    match += 2;.  
10c90 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
10ca0 20 69 66 28 20 28 65 6e 63 3d 3d 53 51 4c 49 54   if( (enc==SQLIT
10cb0 45 5f 55 54 46 31 36 4c 45 20 26 26 20 70 2d 3e  E_UTF16LE && p->
10cc0 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45  iPrefEnc==SQLITE
10cd0 5f 55 54 46 31 36 42 45 29 20 7c 7c 0a 20 20 20  _UTF16BE) ||.   
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 28 65 6e 63              (enc
10cf0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
10d00 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d   && p->iPrefEnc=
10d10 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 29  =SQLITE_UTF16LE)
10d20 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
10d30 68 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  h += 1;.      }.
10d40 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
10d50 3e 62 65 73 74 6d 61 74 63 68 20 29 7b 0a 20 20  >bestmatch ){.  
10d60 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 3b        pBest = p;
10d70 0a 20 20 20 20 20 20 20 20 62 65 73 74 6d 61 74  .        bestmat
10d80 63 68 20 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20  ch = match;.    
10d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10da0 20 2f 2a 20 49 66 20 74 68 65 20 63 72 65 61 74   /* If the creat
10db0 65 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 20  eFlag parameter 
10dc0 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
10dd0 20 73 65 61 63 68 20 64 69 64 20 6e 6f 74 20 72   seach did not r
10de0 65 76 65 61 6c 20 61 6e 0a 20 20 2a 2a 20 65 78  eveal an.  ** ex
10df0 61 63 74 20 6d 61 74 63 68 20 66 6f 72 20 74 68  act match for th
10e00 65 20 6e 61 6d 65 2c 20 6e 75 6d 62 65 72 20 6f  e name, number o
10e10 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  f arguments and 
10e20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 61  encoding, then a
10e30 64 64 20 61 0a 20 20 2a 2a 20 6e 65 77 20 65 6e  dd a.  ** new en
10e40 74 72 79 20 74 6f 20 74 68 65 20 68 61 73 68 20  try to the hash 
10e50 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  table and return
10e60 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
10e70 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 62 65  createFlag && be
10e80 73 74 6d 61 74 63 68 3c 36 20 26 26 20 0a 20 20  stmatch<6 && .  
10e90 20 20 20 20 28 70 42 65 73 74 20 3d 20 73 71 6c      (pBest = sql
10ea0 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
10eb0 28 2a 70 42 65 73 74 29 2b 6e 4e 61 6d 65 2b 31  (*pBest)+nName+1
10ec0 29 29 20 29 7b 0a 20 20 20 20 70 42 65 73 74 2d  )) ){.    pBest-
10ed0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20  >nArg = nArg;.  
10ee0 20 20 70 42 65 73 74 2d 3e 70 4e 65 78 74 20 3d    pBest->pNext =
10ef0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70 42 65   pFirst;.    pBe
10f00 73 74 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  st->zName = (cha
10f10 72 2a 29 26 70 42 65 73 74 5b 31 5d 3b 0a 20 20  r*)&pBest[1];.  
10f20 20 20 70 42 65 73 74 2d 3e 69 50 72 65 66 45 6e    pBest->iPrefEn
10f30 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20 6d 65 6d  c = enc;.    mem
10f40 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e 61 6d 65  cpy(pBest->zName
10f50 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
10f60 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  .    pBest->zNam
10f70 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
10f80 20 20 69 66 28 20 70 42 65 73 74 3d 3d 73 71 6c    if( pBest==sql
10f90 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
10fa0 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65 73 74 2d  db->aFunc,pBest-
10fb0 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c 28 76 6f  >zName,nName,(vo
10fc0 69 64 2a 29 70 42 65 73 74 29 20 29 7b 0a 20 20  id*)pBest) ){.  
10fd0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10fe0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Best);.      ret
10ff0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
11000 0a 0a 20 20 69 66 28 20 70 42 65 73 74 20 26 26  ..  if( pBest &&
11010 20 28 70 42 65 73 74 2d 3e 78 53 74 65 70 20 7c   (pBest->xStep |
11020 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e 63 20 7c  | pBest->xFunc |
11030 7c 20 63 72 65 61 74 65 46 6c 61 67 29 20 29 7b  | createFlag) ){
11040 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 65 73  .    return pBes
11050 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
11060 30 3b 0a 7d 0a                                   0;.}.