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

Artifact fb386ee80026e221869f49159c0963e851c184c9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 39 36 20 32 30 30 37 2f 30 35 2f 33 30 20  .296 2007/05/30 
0220: 31 30 3a 33 36 3a 34 37 20 64 61 6e 69 65 6c 6b  10:36:47 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 6e 74 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  int op = pExpr->
04c0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
04d0: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72  _SELECT ){.    r
04e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
04f0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0500: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
0510: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
0520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
0530: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 69 66  E_OMIT_CAST.  if
0540: 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b  ( op==TK_CAST ){
0550: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
0560: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
0570: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
0580: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
0590: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
05a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
05b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
05c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
05d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
05e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
05f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0600: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0610: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0620: 72 20 74 6f 20 74 68 65 20 72 65 76 69 73 65 64  r to the revised
0630: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
0640: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0650: 71 75 65 6e 63 65 20 69 73 20 6d 61 72 6b 65 64  quence is marked
0660: 20 61 73 20 22 65 78 70 6c 69 63 69 74 22 20 75   as "explicit" u
0670: 73 69 6e 67 20 74 68 65 20 45 50 5f 45 78 70 43  sing the EP_ExpC
0680: 6f 6c 6c 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20  ollate.** flag. 
0690: 20 41 6e 20 65 78 70 6c 69 63 69 74 20 63 6f 6c   An explicit col
06a0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
06b0: 77 69 6c 6c 20 6f 76 65 72 72 69 64 65 20 69 6d  will override im
06c0: 70 6c 69 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74  plicit.** collat
06d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a  ing sequences..*
06e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
06f0: 78 70 72 53 65 74 43 6f 6c 6c 28 50 61 72 73 65  xprSetColl(Parse
0700: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
0710: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
0720: 61 6d 65 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ame){.  CollSeq 
0730: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 45  *pColl;.  if( pE
0740: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
0750: 30 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  0;.  pColl = sql
0760: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
0770: 71 28 70 50 61 72 73 65 2c 20 28 63 68 61 72 2a  q(pParse, (char*
0780: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
0790: 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  ->n);.  if( pCol
07a0: 6c 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  l ){.    pExpr->
07b0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20  pColl = pColl;. 
07c0: 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
07d0: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
07e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
07f0: 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Expr;.}../*.** R
0800: 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
0810: 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
0820: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0830: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0840: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0850: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
0860: 6f 6e 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20  on type, return 
0870: 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  0..*/.CollSeq *s
0880: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
0890: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
08a0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
08b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
08c0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
08d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
08e0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pExpr->pColl;.  
08f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
0900: 3d 54 4b 5f 43 41 53 54 20 26 26 20 21 70 43 6f  =TK_CAST && !pCo
0910: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
0920: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
0930: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
0940: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0950: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0960: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0970: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0980: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0990: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
09a0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
09b0: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
09c0: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
09d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
09e0: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
09f0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0a00: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0a10: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0a20: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0a30: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0a40: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0a50: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0a60: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0a70: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0a80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0a90: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0aa0: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0ab0: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0ac0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0ad0: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0ae0: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0af0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0b00: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0b10: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0b20: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0b30: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0b40: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0b50: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0b60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0b70: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0b80: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0b90: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0ba0: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0bb0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0bc0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0bd0: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0be0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0bf0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0c00: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0c10: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0c20: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0c30: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0c40: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0c50: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0c60: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0c70: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0c90: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0ca0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0cb0: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0cc0: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0cd0: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0ce0: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0cf0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0d00: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0d10: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0d20: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0d30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0d40: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0d50: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0d60: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0d70: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0d80: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0d90: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0da0: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0db0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0dc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0dd0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0de0: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0df0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0e00: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0e10: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0e20: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0e30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0e40: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0e50: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0e60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0e70: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0e80: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0e90: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0ea0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0eb0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0ec0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0ed0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0ee0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0ef0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0f00: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0f10: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0f20: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0f30: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0f40: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
0f50: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
0f60: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
0f70: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0f80: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
0f90: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
0fa0: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
0fb0: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
0fc0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
0fd0: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
0fe0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
0ff0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
1000: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
1010: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
1020: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
1030: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
1040: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1050: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1060: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1070: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1080: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1090: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
10a0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10b0: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
10c0: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
10d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
10e0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
10f0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
1100: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
1110: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
1120: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
1130: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
1140: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1150: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1160: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1170: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1180: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1190: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
11a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
11b0: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
11c0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
11d0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
11e0: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
11f0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
1200: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1210: 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20 73   P1 value that s
1220: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1230: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
1240: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1250: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1260: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1270: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1280: 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d  Expr2..** If jum
1290: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c  pIfNull is true,
12a0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f   then set the lo
12b0: 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72 65  w byte of the re
12c0: 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c  turned.** P1 val
12d0: 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f  ue to tell the o
12e0: 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66  pcode to jump if
12f0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1300: 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20  on.** evaluates 
1310: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
1320: 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d  ic int binaryCom
1330: 70 61 72 65 50 31 28 45 78 70 72 20 2a 70 45 78  pareP1(Expr *pEx
1340: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1350: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1360: 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  l){.  char aff =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1380: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1390: 72 65 74 75 72 6e 20 28 28 69 6e 74 29 73 71 6c  return ((int)sql
13a0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
13b0: 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29  ity(pExpr1, aff)
13c0: 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78  )+(jumpIfNull?0x
13d0: 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  100:0);.}../*.**
13e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
13f0: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
1400: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74  on sequence that
1410: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1420: 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63  by.** a binary c
1430: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1440: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65  or comparing pLe
1450: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
1460: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74  *.** If the left
1470: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
1480: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
1490: 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20   sequence type, 
14a0: 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73  then it is.** us
14b0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  ed. Otherwise th
14c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
14d0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67  ence for the rig
14e0: 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ht hand expressi
14f0: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f  on.** is used, o
1500: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42  r the default (B
1510: 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65  INARY) if neithe
1520: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  r expression has
1530: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20   a collating.** 
1540: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  type..**.** Argu
1550: 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74  ment pRight (but
1560: 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20   not pLeft) may 
1570: 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  be a null pointe
1580: 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
1590: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f  .** it is not co
15a0: 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c  nsidered..*/.Col
15b0: 6c 53 65 71 2a 20 73 71 6c 69 74 65 33 42 69 6e  lSeq* sqlite3Bin
15c0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
15d0: 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  q(.  Parse *pPar
15e0: 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65  se, .  Expr *pLe
15f0: 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69  ft, .  Expr *pRi
1600: 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ght.){.  CollSeq
1610: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72   *pColl;.  asser
1620: 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66  t( pLeft );.  if
1630: 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ( pLeft->flags &
1640: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29   EP_ExpCollate )
1650: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
1660: 65 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  eft->pColl );.  
1670: 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d    pColl = pLeft-
1680: 3e 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  >pColl;.  }else 
1690: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
16a0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
16b0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20  _ExpCollate ){. 
16c0: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
16d0: 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t->pColl );.    
16e0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
16f0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pColl;.  }else{.
1700: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1710: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1720: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
1730: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1740: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
1750: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1760: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
1770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1780: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1790: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17a0: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
17b0: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
17c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
17d0: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
17e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
17f0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1800: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
1810: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
1820: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
1830: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
1840: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
1850: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
1860: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1870: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1880: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1890: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
18a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  e */.  int dest,
18b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
18c0: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
18d0: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
18e0: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
18f0: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
1900: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
1910: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 31  L */.){.  int p1
1920: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
1930: 50 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P1(pLeft, pRight
1940: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1950: 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 73   CollSeq *p3 = s
1960: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
1970: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
1980: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1990: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
19a0: 74 65 33 56 64 62 65 4f 70 33 28 70 50 61 72 73  te3VdbeOp3(pPars
19b0: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
19c0: 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69  , p1, dest, (voi
19d0: 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45  d*)p3, P3_COLLSE
19e0: 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  Q);.}../*.** Con
19f0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
1a00: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
1a10: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1a20: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
1a30: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
1a40: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
1a50: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
1a60: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
1a70: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
1a80: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
1a90: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
1aa0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
1ab0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
1ac0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
1ad0: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1ae0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1af0: 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  t, const Token *
1b00: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1b10: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1b20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1b30: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
1b40: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1b50: 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f     /* When mallo
1b60: 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65 20  c fails, delete 
1b70: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1b80: 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70 61  . Expressions pa
1b90: 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a 20  ssed to .    ** 
1ba0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
1bb0: 73 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c 6c  st always be all
1bc0: 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c 69  ocated with sqli
1bd0: 74 65 33 45 78 70 72 28 29 20 66 6f 72 20 74 68  te3Expr() for th
1be0: 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73 6f  is .    ** reaso
1bf0: 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  n. .    */.    s
1c00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1c10: 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  (pLeft);.    sql
1c20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1c30: 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75  Right);.    retu
1c40: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
1c50: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65  ->op = op;.  pNe
1c60: 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74  w->pLeft = pLeft
1c70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
1c80: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e 65   = pRight;.  pNe
1c90: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
1ca0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1cb0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1cc0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
1cd0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
1ce0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
1cf0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
1d00: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 69 66 28  pLeft ){.    if(
1d10: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
1d20: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
1d30: 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73  (pNew, &pLeft->s
1d40: 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70  pan, &pRight->sp
1d50: 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  an);.      if( p
1d60: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
1d70: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
1d80: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
1d90: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
1da0: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  late;.        pN
1db0: 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 52 69 67  ew->pColl = pRig
1dc0: 68 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ht->pColl;.     
1dd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1de0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1df0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1e00: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  .      pNew->fla
1e10: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
1e20: 61 74 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ate;.      pNew-
1e30: 3e 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e  >pColl = pLeft->
1e40: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  pColl;.    }.  }
1e50: 0a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ..  sqlite3ExprS
1e60: 65 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a  etHeight(pNew);.
1e70: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1e80: 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69  ../*.** Works li
1e90: 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 28 29  ke sqlite3Expr()
1ea0: 20 62 75 74 20 66 72 65 65 73 20 69 74 73 20 70   but frees its p
1eb0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
1ec0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 69 66 20  arguments.** if 
1ed0: 69 74 20 66 61 69 6c 73 20 64 75 65 20 74 6f 20  it fails due to 
1ee0: 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62 6c 65 6d  a malloc problem
1ef0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1f00: 65 33 45 78 70 72 4f 72 46 72 65 65 28 69 6e 74  e3ExprOrFree(int
1f10: 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74   op, Expr *pLeft
1f20: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20  , Expr *pRight, 
1f30: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
1f40: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
1f50: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1f60: 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  (op, pLeft, pRig
1f70: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  ht, pToken);.  i
1f80: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1f90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1fa0: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1fb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1fc0: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  e(pRight);.  }. 
1fd0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1fe0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
1ff0: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
2000: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
2010: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
2020: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
2030: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
2040: 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
2050: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
2060: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
2070: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
2080: 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65 20   "#0" means the 
2090: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
20a0: 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20  ..** "#1" means 
20b0: 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e  the next down on
20c0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64   the stack.  And
20d0: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
20e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
20f0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2100: 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77 69  arser to deal wi
2110: 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 74  th on of those t
2120: 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65  erms..** It imme
2130: 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74 65  diately generate
2140: 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65 20  s code to store 
2150: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20 6d  the value in a m
2160: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
2170: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20 61  ** The returns a
2180: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
2190: 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20 65  t will code to e
21a0: 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
21b0: 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d 65   from.** that me
21c0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61 73  mory location as
21d0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70 72   needed..*/.Expr
21e0: 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74 65   *sqlite3Registe
21f0: 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  rExpr(Parse *pPa
2200: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
2210: 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  en){.  Vdbe *v =
2220: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2230: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e 74    Expr *p;.  int
2240: 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 70 50   depth;.  if( pP
2250: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
2260: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
2270: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2280: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
2290: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
22a0: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
22b0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
22c0: 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ULL, 0, 0, 0);. 
22d0: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
22e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
22f0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
2300: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
2310: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
2320: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2330: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
2340: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
2350: 65 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61  epth = atoi((cha
2360: 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  r*)&pToken->z[1]
2370: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
2380: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
2390: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
23a0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
23b0: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
23c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
23d0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
23e0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
23f0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2400: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
2410: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
2420: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
2430: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
2440: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
2450: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2460: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
2470: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
2480: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
2490: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
24a0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
24b0: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
24c0: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
24d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
24e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
24f0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
2500: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
2510: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
2520: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
2530: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2540: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
2550: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
2560: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2570: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2580: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2590: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
25a0: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
25b0: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
25c0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
25d0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
25e0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
25f0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2600: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
2610: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
2620: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
2630: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
2640: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
2650: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2660: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2670: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2680: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2690: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
26a0: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
26b0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
26c0: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
26d0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
26e0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
26f0: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
2700: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
2710: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
2720: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
2730: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
2740: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
2750: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
2760: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2770: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2780: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2790: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
27a0: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
27b0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
27c0: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
27d0: 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  pNew;.  assert( 
27e0: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
27f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
2800: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
2810: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2830: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
2840: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61  t); /* Avoid lea
2850: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e  king memory when
2860: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2870: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2880: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2890: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70  TK_FUNCTION;.  p
28a0: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
28b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  st;.  assert( pT
28c0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
28d0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
28e0: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d  *pToken;.  pNew-
28f0: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
2900: 6b 65 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 45  ken;..  sqlite3E
2910: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 4e 65  xprSetHeight(pNe
2920: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
2930: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
2940: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
2950: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
2960: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2970: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2980: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2990: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
29a0: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
29b0: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
29c0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
29d0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
29e0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
29f0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2a00: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
2a10: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
2a20: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
2a30: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
2a40: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
2a50: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
2a60: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2a70: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2a80: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2a90: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2aa0: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2ab0: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2ac0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
2ad0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2ae0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2af0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
2b00: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
2b10: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
2b20: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2b30: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2b40: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2b50: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2b60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2b70: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2b80: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2b90: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2ba0: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2bb0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2bc0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
2bd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2be0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
2bf0: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
2c00: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2c10: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
2c20: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2c30: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2c40: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2c50: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2c60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2c70: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2c80: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2c90: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2ca0: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2cb0: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2cc0: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
2cd0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
2ce0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
2cf0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
2d00: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
2d10: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
2d20: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2d30: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2d40: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2d50: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2d60: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2d70: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2d80: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2da0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2db0: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
2dc0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20  ken->z[1]);.    
2dd0: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c  if( i<1 || i>SQL
2de0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
2df0: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20  _NUMBER ){.     
2e00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e10: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
2e20: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
2e30: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
2e40: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
2e50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
2e60: 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
2e70: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
2e80: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
2e90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2ea0: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
2eb0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
2ec0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2ed0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2ee0: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
2ef0: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
2f00: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
2f10: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
2f20: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
2f30: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
2f40: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
2f50: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
2f60: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
2f70: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
2f80: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
2f90: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
2fa0: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
2fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2fc0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
2fd0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
2fe0: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
2ff0: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
3000: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
3010: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
3020: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
3030: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
3040: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
3050: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
3060: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3070: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
3080: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30a0: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
30b0: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
30c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
30d0: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
30e0: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
30f0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
3100: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
3110: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
3120: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
3130: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
3140: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3150: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
3160: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
3170: 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  r = sqliteReallo
3180: 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
3190: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
31c0: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
31d0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
31e0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  [0]) );.      }.
31f0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3200: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
3210: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
3220: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
3230: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
3240: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
3250: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
3260: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
3270: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
3280: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
3290: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
32a0: 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c 49 54 45  rse->nVar>SQLITE
32b0: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
32c0: 4d 42 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  MBER ){.    sqli
32d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
32e0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
32f0: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
3300: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
3310: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
3320: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3330: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
3350: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
3360: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
3370: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
3380: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3390: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
33a0: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
33b0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
33c0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
33d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
33e0: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
33f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3400: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
3410: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
3420: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
3430: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
3440: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
3450: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
3460: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
3470: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
3480: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
3490: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
34a0: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
34b0: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
34c0: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
34d0: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
34e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
34f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
3500: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
3510: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3520: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
3530: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
3540: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
3550: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3560: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
3580: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
3590: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
35a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
35b0: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
35c0: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
35d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
35e0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
35f0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
3600: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
3610: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
3620: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
3630: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
3640: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
3650: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
3660: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
3670: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
3680: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
3690: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
36a0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
36b0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
36c0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
36d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
36e0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
36f0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
3700: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3710: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
3720: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
3730: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
3740: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
3750: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
3760: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
3770: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3780: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3790: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
37a0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
37b0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
37c0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
37d0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
37e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
37f0: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
3800: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3810: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3820: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3830: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3840: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3850: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3860: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
3870: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3880: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3890: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
38a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
38b0: 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  .z = (u8*)sqlite
38c0: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
38d0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
38e0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
38f0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
3900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3910: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
3920: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
3930: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
3940: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3960: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e  (p->pLeft);.  pN
3970: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
3980: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3990: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
39a0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
39b0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
39c0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
39d0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
39e0: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c  electDup(p->pSel
39f0: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ect);.  return p
3a00: 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  New;.}.void sqli
3a10: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b  te3TokenCopy(Tok
3a20: 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a  en *pTo, Token *
3a30: 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54  pFrom){.  if( pT
3a40: 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  o->dyn ) sqliteF
3a50: 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e  ree((char*)pTo->
3a60: 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  z);.  if( pFrom-
3a70: 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e  >z ){.    pTo->n
3a80: 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20   = pFrom->n;.   
3a90: 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73   pTo->z = (u8*)s
3aa0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
3ab0: 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  ar*)pFrom->z, pF
3ac0: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
3ad0: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
3ae0: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
3af0: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
3b00: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
3b10: 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20  istDup(ExprList 
3b20: 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  *p){.  ExprList 
3b30: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
3b40: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
3b50: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
3b60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3b70: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3b80: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3b90: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
3ba0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3bb0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3bc0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
3bd0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3be0: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
3bf0: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
3c00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
3c10: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
3c20: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3c30: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3c40: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3c50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3c60: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
3c70: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
3c80: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
3c90: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
3ca0: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
3cb0: 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70  pr *pNewExpr, *p
3cc0: 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74  OldExpr;.    pIt
3cd0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
3ce0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
3cf0: 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d  prDup(pOldExpr =
3d00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
3d10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
3d20: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
3d30: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
3d40: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
3d50: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
3d60: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
3d70: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
3d80: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
3d90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3da0: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
3db0: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
3dc0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
3dd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
3de0: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
3df0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
3e00: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
3e10: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
3e20: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3e30: 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  y(&pNewExpr->spa
3e40: 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70  n, &pOldExpr->sp
3e50: 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  an);.    }.    a
3e60: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d  ssert( pNewExpr=
3e70: 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e  =0 || pNewExpr->
3e80: 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20  span.z!=0 .     
3e90: 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78         || pOldEx
3ea0: 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20  pr->span.z==0.  
3eb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3ec0: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
3ed0: 28 29 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  () );.    pItem-
3ee0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
3ef0: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3f00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
3f10: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
3f20: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
3f30: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  er;.    pItem->i
3f40: 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sAgg = pOldItem-
3f50: 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65  >isAgg;.    pIte
3f60: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  m->done = 0;.  }
3f70: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
3f90: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
3fa0: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
3fb0: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
3fc0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
3fd0: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
3fe0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3ff0: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
4000: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
4010: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
4020: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
4030: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
4040: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
4050: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
4060: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
4070: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4080: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
4090: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
40a0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
40b0: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
40c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
40d0: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
40e0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
40f0: 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
4100: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
4110: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
4120: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
4130: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
4140: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
4150: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
4160: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
4170: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
4180: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
4190: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
41a0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
41b0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
41c0: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
41d0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
41e0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
41f0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
4200: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
4210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
4220: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
4230: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
4240: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
4250: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4260: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
4270: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
4280: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
4290: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
42a0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
42b0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
42c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
42d0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
42e0: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
42f0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
4300: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
4310: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
4320: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
4330: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
4340: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
4350: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
4360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
4370: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
4380: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
4390: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
43a0: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62  ulated;.    pTab
43b0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
43c0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
43d0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
43e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
43f0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
4400: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
4410: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
4420: 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  ectDup(pOldItem-
4430: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70  >pSelect);.    p
4440: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
4450: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
4460: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
4470: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
4480: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
4490: 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  stDup(pOldItem->
44a0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
44b0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
44c0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
44d0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
44e0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
44f0: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
4500: 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  p(IdList *p){.  
4510: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
4520: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
4530: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4540: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
4550: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
4560: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
4570: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4580: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
4590: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
45a0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
45b0: 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  a = sqliteMalloc
45c0: 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  Raw( p->nId*size
45d0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
45e0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
45f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
4600: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
4610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
4620: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
4630: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
4640: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
4650: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4660: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4670: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
4680: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4690: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
46a0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
46b0: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
46c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
46d0: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
46e0: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
46f0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4700: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
4710: 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20  electDup(Select 
4720: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
4730: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
4740: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4750: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
4760: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
4770: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4780: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4790: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
47a0: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
47b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
47c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
47d0: 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29  stDup(p->pEList)
47e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
47f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4800: 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  up(p->pSrc);.  p
4810: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
4820: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
4830: 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d  pWhere);.  pNew-
4840: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
4850: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4860: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70  ->pGroupBy);.  p
4870: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
4880: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
4890: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65  >pHaving);.  pNe
48a0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
48b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
48c0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
48d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
48e0: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  p;.  pNew->pPrio
48f0: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
4900: 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b  tDup(p->pPrior);
4910: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
4920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4930: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70  (p->pLimit);.  p
4940: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
4950: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
4960: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65  >pOffset);.  pNe
4970: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
4980: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
4990: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  = -1;.  pNew->is
49a0: 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73  Resolved = p->is
49b0: 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77  Resolved;.  pNew
49c0: 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41  ->isAgg = p->isA
49d0: 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73  gg;.  pNew->uses
49e0: 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Ephm = 0;.  pNew
49f0: 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
4a00: 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
4a10: 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
4a20: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
4a30: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
4a40: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
4a50: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
4a60: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
4a70: 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  2] = -1;.  retur
4a80: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
4a90: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
4aa0: 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20  electDup(Select 
4ab0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4ac0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
4ad0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
4ae0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
4af0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
4b00: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4b10: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
4b20: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
4b30: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
4b40: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
4b50: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
4b60: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4b70: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
4b80: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
4b90: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
4ba0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28  n *pName){.  if(
4bb0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
4bc0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
4bd0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
4be0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
4bf0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4c00: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
4c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4c20: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
4c30: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
4c40: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
4c50: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
4c60: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4c70: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
4c80: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
4c90: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
4ca0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
4cb0: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e  lloc(pList->a, n
4cc0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
4cd0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
4ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
4cf0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
4d00: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
4d10: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
4d20: 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61  loc = n;.  }.  a
4d30: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
4d40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
4d50: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
4d60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4d70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
4d80: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
4d90: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
4da0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
4db0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
4dc0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
4dd0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
4de0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4df0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
4e00: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
4e10: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
4e20: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
4e30: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
4e40: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
4e50: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
4e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4e70: 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71  ete(pExpr);.  sq
4e80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4e90: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
4ea0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4eb0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
4ec0: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
4ed0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
4ee0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
4ef0: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
4f00: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
4f10: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
4f20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
4f30: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
4f40: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
4f50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
4f60: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a 20  .  int iLimit,. 
4f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
4f80: 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70 45  ject.){.  if( pE
4f90: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
4fa0: 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b 0a  nExpr>iLimit ){.
4fb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4fc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
4fd0: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
4fe0: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
4ff0: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53 51 4c 49    }.}...#if SQLI
5000: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5010: 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  H>0./* The follo
5020: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
5030: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
5040: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
5050: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
5060: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
5070: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
5080: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5090: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
50a0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
50b0: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
50c0: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
50d0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
50e0: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
50f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5100: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5110: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
5120: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
5130: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
5140: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
5150: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
5160: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
5170: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
5180: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5190: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
51a0: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
51b0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
51c0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
51d0: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
51e0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
51f0: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5200: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
5220: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
5230: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
5240: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5250: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
5260: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5270: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
5280: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5290: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
52a0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
52b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
52c0: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
52d0: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
52e0: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
52f0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
5300: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5310: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
5320: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
5330: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
5340: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5350: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
5360: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
5370: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5380: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
5390: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
53a0: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
53b0: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
53c0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53d0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
53e0: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, pnHeight);.
53f0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5400: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
5410: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5420: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5430: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
5440: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
5450: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
5460: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
5470: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5480: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5490: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
54a0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
54b0: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
54c0: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
54d0: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
54e0: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
54f0: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
5500: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
5510: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
5520: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
5530: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
5540: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
5550: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
5560: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5570: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 45  3ExprSetHeight(E
5580: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5590: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
55a0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
55b0: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
55c0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
55d0: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
55e0: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
55f0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74  xprList(p->pList
5600: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5610: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
5620: 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  >pSelect, &nHeig
5630: 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68  ht);.  p->nHeigh
5640: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5660: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5670: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
5680: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5690: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
56a0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
56b0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
56c0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
56d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
56e0: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
56f0: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
5700: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
5710: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
5720: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
5730: 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eight;.}.#endif.
5740: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
5750: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
5760: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
5770: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5780: 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20  Delete(ExprList 
5790: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
57a0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
57b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
57c0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
57d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
57e0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
57f0: 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  || (pList->nExpr
5800: 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41  ==0 && pList->nA
5810: 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73  lloc==0) );.  as
5820: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
5830: 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  pr<=pList->nAllo
5840: 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  c );.  for(pItem
5850: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
5860: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
5870: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
5880: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5890: 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  lete(pItem->pExp
58a0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
58b0: 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
58c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
58d0: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
58e0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
58f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
5900: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
5910: 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63  ree.  Call xFunc
5920: 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76   for each node v
5930: 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  isited..**.** Th
5940: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
5950: 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d  rom xFunc determ
5960: 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ines whether the
5970: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69   tree walk conti
5980: 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73  nues..** 0 means
5990: 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e   continue walkin
59a0: 67 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d  g the tree.  1 m
59b0: 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b  eans do not walk
59c0: 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20   children.** of 
59d0: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
59e0: 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69   but continue wi
59f0: 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20  th siblings.  2 
5a00: 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a  means abandon.**
5a10: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
5a20: 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  ompletely..**.**
5a30: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5a40: 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74  e from this rout
5a50: 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e  ine is 1 to aban
5a60: 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c  don the tree wal
5a70: 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f  k.** and 0 to co
5a80: 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f  ntinue..**.** NO
5a90: 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f 75 74  TICE:  This rout
5aa0: 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 64  ine does *not* d
5ab0: 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75 62 71  escend into subq
5ac0: 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ueries..*/.stati
5ad0: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69  c int walkExprLi
5ae0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69  st(ExprList *, i
5af0: 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45  nt (*)(void *, E
5b00: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a  xpr*), void *);.
5b10: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
5b20: 78 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45  xprTree(Expr *pE
5b30: 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63  xpr, int (*xFunc
5b40: 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20  )(void*,Expr*), 
5b50: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
5b60: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78  nt rc;.  if( pEx
5b70: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
5b80: 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63  ;.  rc = (*xFunc
5b90: 29 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a  )(pArg, pExpr);.
5ba0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
5bb0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
5bc0: 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ree(pExpr->pLeft
5bd0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
5be0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
5bf0: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
5c00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78  pExpr->pRight, x
5c10: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
5c20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
5c30: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78  walkExprList(pEx
5c40: 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63  pr->pList, xFunc
5c50: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
5c60: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
5c70: 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc>1;.}../*.** 
5c80: 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65  Call walkExprTre
5c90: 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  e() for every ex
5ca0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74  pression in list
5cb0: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   p..*/.static in
5cc0: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
5cd0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
5ce0: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
5cf0: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
5d00: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
5d10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5d20: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5d30: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
5d40: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45  0;.  for(i=p->nE
5d50: 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b  xpr, pItem=p->a;
5d60: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
5d70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c  ++){.    if( wal
5d80: 6b 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d  kExprTree(pItem-
5d90: 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70  >pExpr, xFunc, p
5da0: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
5db0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
5dd0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
5de0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
5df0: 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20  on in Select p, 
5e00: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
5e10: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
5e20: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75  t are part of su
5e30: 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79  b-selects in any
5e40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20   FROM clause or 
5e50: 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20  the LIMIT.** or 
5e60: 4f 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f  OFFSET expressio
5e70: 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ns...*/.static i
5e80: 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70  nt walkSelectExp
5e90: 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  r(Select *p, int
5ea0: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a   (*xFunc)(void *
5eb0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
5ec0: 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70  pArg){.  walkExp
5ed0: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
5ee0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5ef0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d   walkExprTree(p-
5f00: 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20  >pWhere, xFunc, 
5f10: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
5f20: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
5f30: 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  y, xFunc, pArg);
5f40: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
5f50: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e  p->pHaving, xFun
5f60: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
5f70: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
5f80: 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  erBy, xFunc, pAr
5f90: 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  g);.  if( p->pPr
5fa0: 69 6f 72 20 29 7b 0a 20 20 20 20 77 61 6c 6b 53  ior ){.    walkS
5fb0: 65 6c 65 63 74 45 78 70 72 28 70 2d 3e 70 50 72  electExpr(p->pPr
5fc0: 69 6f 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ior, xFunc, pArg
5fd0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5fe0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
5ff0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
6000: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
6010: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
6020: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
6030: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
6040: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
6050: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
6060: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
6070: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
6080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
6090: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
60a0: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
60b0: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
60c0: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
60d0: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
60e0: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
60f0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
6100: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
6110: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
6120: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
6130: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
6140: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
6150: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
6160: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
6170: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
6180: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
6190: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
61a0: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
61b0: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
61c0: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
61d0: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
61e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
61f0: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
6200: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
6210: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
6220: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
6230: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6240: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
6250: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
6260: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
6270: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
6280: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
6290: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
62a0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
62b0: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
62c0: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
62d0: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41  t.    ** and *pA
62e0: 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73  rg==2 */.    cas
62f0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
6300: 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a       if( *((int*
6310: 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75  )pArg)==2 ) retu
6320: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
6330: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
6340: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
6350: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
6360: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
6370: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
6380: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
6390: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
63a0: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
63b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
63c0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
63d0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
63e0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
63f0: 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29  f.      *((int*)
6400: 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20  pArg) = 0;.     
6410: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
6420: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
6430: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6440: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
6450: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
6460: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6470: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
6480: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
6490: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
64a0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
64b0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
64c0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
64d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
64e0: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
64f0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
6500: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
6510: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
6520: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6530: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
6540: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
6550: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
6560: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
6570: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
6580: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
6590: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
65a0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
65b0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
65c0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
65d0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
65e0: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
65f0: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
6600: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
6610: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
6620: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
6630: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
6640: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
6650: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
6660: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
6670: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
6680: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
6690: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
66a0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
66b0: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
66c0: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
66d0: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
66e0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
66f0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
6700: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
6710: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
6720: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
6730: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
6740: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
6750: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
6760: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
6770: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
6780: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
6790: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
67a0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
67b0: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
67c0: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
67d0: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
67e0: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
67f0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
6800: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
6810: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
6820: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
6830: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
6840: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
6850: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
6860: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
6870: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
6880: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
6890: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
68a0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
68b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
68c0: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
68d0: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
68e0: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
68f0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
6900: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
6910: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
6920: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
6930: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6940: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
6950: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
6960: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
6970: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
6980: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
6990: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
69a0: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
69b0: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
69c0: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
69d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
69e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
69f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6a00: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
6a10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
6a20: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
6a30: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
6a40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
6a50: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
6a60: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
6a70: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
6a80: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
6a90: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
6aa0: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
6ab0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6ad0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6ae0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
6af0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
6b10: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
6b20: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
6b30: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
6b40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
6b50: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
6b60: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
6b70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
6b80: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
6b90: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
6ba0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
6bb0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
6bc0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
6bd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
6be0: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
6bf0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
6c00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
6c10: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
6c20: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
6c30: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
6c40: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
6c50: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
6c60: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
6c70: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
6c80: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
6c90: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
6ca0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
6cb0: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
6cc0: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
6cd0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
6ce0: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
6cf0: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
6d00: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
6d10: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
6d20: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
6d30: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
6d40: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a  tabase holding.*
6d50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
6d60: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
6d70: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
6d80: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
6d90: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
6da0: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
6db0: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
6dc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6dd0: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
6de0: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
6df0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
6e00: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
6e10: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
6e20: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
6e30: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
6e40: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
6e50: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
6e60: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
6e70: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
6e80: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
6e90: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
6ea0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
6eb0: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
6ec0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
6ed0: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
6ee0: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
6ef0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
6f00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
6f10: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
6f20: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
6f30: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
6f40: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
6f50: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
6f60: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
6f70: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
6f80: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
6f90: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
6fa0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6fb0: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
6fc0: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
6fd0: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
6fe0: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
6ff0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
7000: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
7010: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
7020: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
7030: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
7040: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
7050: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
7060: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
7070: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
7080: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
7090: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
70a0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
70b0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
70c0: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
70d0: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
70e0: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
70f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
7100: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
7110: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7120: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7130: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
7140: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
7150: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
7160: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
7170: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
7180: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
7190: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
71a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
71b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
71c0: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
71d0: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
71e0: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
71f0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
7200: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7210: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
7220: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
7230: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
7240: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
7250: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
7260: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
7270: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
7280: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
7290: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
72a0: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
72b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
72c0: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
72d0: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
72e0: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
72f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
7300: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
7310: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
7320: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
7330: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
7340: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
7350: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
7360: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
7370: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7380: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
7390: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
73a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
73b0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
73c0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
73d0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
73e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
73f0: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
7400: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7410: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
7420: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
7430: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
7440: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7450: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
7460: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
7470: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
7480: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
7490: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
74a0: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
74b0: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
74c0: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
74d0: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
74e0: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
74f0: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
7500: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20  n the list */.. 
7510: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
7520: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
7530: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
7540: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
7550: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
7560: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
7570: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62  ameFromToken(pDb
7580: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
7590: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
75a0: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65  Token(pTableToke
75b0: 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c  n);.  zCol = sql
75c0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
75d0: 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b  n(pColumnToken);
75e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
75f0: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
7600: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
7610: 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ame_end;.  }..  
7620: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
7630: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43  -1;.  while( pNC
7640: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
7650: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7660: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
7670: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
7680: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
7690: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
76a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
76b0: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
76c0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
76d0: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
76e0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
76f0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *pTab;.        
7700: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
7710: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
7720: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d   .        pTab =
7730: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
7740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7750: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ab!=0 );.       
7760: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7770: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
7780: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7790: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
77a0: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
77b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
77c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
77d0: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
77e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
77f0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
7800: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
7810: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
7820: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
7830: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
7840: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7850: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7860: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
7870: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
7880: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7890: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
78a0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
78b0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
78c0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
78d0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
78e0: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
78f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
7900: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
7910: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
7920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
7930: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
7940: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
7950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7960: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
7970: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
7980: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
7990: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
79a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
79b0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
79c0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
79d0: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
79e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  em;.        }.  
79f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
7a00: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
7a10: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
7a20: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
7a30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a40: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
7a50: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
7a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7a70: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
7a80: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
7a90: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
7aa0: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
7ab0: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
7ac0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
7ad0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
7ae0: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
7af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
7b00: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
7b10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7b20: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
7b30: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
7b40: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
7b50: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
7b60: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
7b70: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
7b80: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
7b90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7ba0: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
7bb0: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
7bc0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7bd0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
7be0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
7bf0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
7c00: 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61   if( (pExpr->fla
7c10: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
7c20: 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)==0 ){.      
7c30: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
7c40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
7c50: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
7c60: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c  C(db), zColl,-1,
7c70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
7c80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
7c90: 66 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  f( i<pSrcList->n
7ca0: 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Src-1 ){.       
7cb0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
7cc0: 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
7cd0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7cf0: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
7d00: 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65  curred in the le
7d10: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61  ft table of a na
7d20: 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20  tural join,.    
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
7d40: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67  hen skip the rig
7d50: 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69  ht table to avoi
7d60: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
7d70: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
7d80: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
7db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55     }else if( (pU
7dc0: 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e  sing = pItem[1].
7dd0: 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  pUsing)!=0 ){.  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7df0: 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f   If this match o
7e00: 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d  ccurs on a colum
7e10: 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  n that is in the
7e20: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
7e40: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
7e50: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
7e60: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
7e70: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
7e80: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f             ** to
7e90: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
7ea0: 74 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20  te match there. 
7eb0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
7ec0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
7ed0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
7ee0: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
7ef0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
7f00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7f10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
7f20: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
7f30: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
7f70: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
7f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
7fb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7fd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
7fe0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
7ff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8000: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65   }.    }..#ifnde
8010: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
8020: 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20  IGGER.    /* If 
8030: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
8040: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
8050: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
8060: 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  e .    ** it is 
8070: 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  a new.* or old.*
8080: 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e   trigger argumen
8090: 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  t reference.    
80a0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d  */.    if( zDb==
80b0: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
80c0: 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65  cnt==0 && pParse
80d0: 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29  ->trigStack!=0 )
80e0: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53  {.      TriggerS
80f0: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
8100: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
8110: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54  igStack;.      T
8120: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
8130: 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67        if( pTrigg
8140: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20  erStack->newIdx 
8150: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
8160: 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a  StrICmp("new", z
8170: 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Tab) == 0 ){.   
8180: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8190: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
81a0: 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20  ck->newIdx;.    
81b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
81c0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
81d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
81e0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
81f0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c  >pTab;.      }el
8200: 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53  se if( pTriggerS
8210: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20  tack->oldIdx != 
8220: 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  -1 && sqlite3Str
8230: 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62  ICmp("old", zTab
8240: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8250: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
8260: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f  pTriggerStack->o
8270: 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61  ldIdx;.        a
8280: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
8290: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
82a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
82b0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
82c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
82d0: 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20   if( pTab ){ .  
82e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
82f0: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
8300: 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  pCol = pTab->aCo
8310: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70  l;..        pExp
8320: 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61  r->pSchema = pTa
8330: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
8340: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
8350: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
8360: 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e  ; iCol < pTab->n
8370: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f  Col; iCol++, pCo
8380: 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  l++) {.         
8390: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
83a0: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
83b0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
83c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
83d0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61  har *zColl = pTa
83e0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43  b->aCol[iCol].zC
83f0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
8400: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
8410: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
8420: 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  mn = iCol==pTab-
8430: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43  >iPKey ? -1 : iC
8440: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
8450: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
8460: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
8470: 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  l].affinity;.   
8480: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45           if( (pE
8490: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
84a0: 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29  ExpCollate)==0 )
84b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
84c0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
84d0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
84e0: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
84f0: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
8500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8510: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54         pExpr->pT
8520: 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
8530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8550: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
8570: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8580: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20  _TRIGGER) */..  
8590: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68    /*.    ** Perh
85a0: 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20  aps the name is 
85b0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
85c0: 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a  he ROWID.    */.
85d0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
85e0: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
85f0: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
8600: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  ol) ){.      cnt
8610: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
8620: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
8630: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66  .      pExpr->af
8640: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8650: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8660: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
8670: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
8680: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
8690: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
86a0: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
86b0: 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20   Z.    ** might 
86c0: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
86d0: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
86e0: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
86f0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
8700: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73     ** we are res
8710: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
8720: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8730: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8740: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a  g command:.    *
8750: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
8760: 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f  ECT a+b AS x FRO
8770: 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c  M table WHERE x<
8780: 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  10;.    **.    *
8790: 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20  * In cases like 
87a0: 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45  this, replace pE
87b0: 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20  xpr with a copy 
87c0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
87d0: 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f  n that.    ** fo
87e0: 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  rms the result s
87f0: 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20  et entry ("a+b" 
8800: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
8810: 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
8820: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e  iately..    ** N
8830: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
8840: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
8850: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
8860: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8870: 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  en.    ** resolv
8880: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
8890: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
88a0: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  is resolved..   
88b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
88c0: 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20  =0 && (pEList = 
88d0: 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20  pNC->pEList)!=0 
88e0: 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20  && zTab==0 ){.  
88f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
8900: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
8910: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
8920: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
8930: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
8940: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
8950: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8960: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
8970: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
8980: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 20 20   *pDup;.        
8990: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
89a0: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
89b0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
89c0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
89d0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
89e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
89f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
8a00: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
8a10: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
8a20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
8a30: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
8a40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8a50: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
8a60: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70              pDup
8a80: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d  ->pColl = pExpr-
8a90: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  >pColl;.        
8aa0: 20 20 20 20 70 44 75 70 2d 3e 66 6c 61 67 73 20      pDup->flags 
8ab0: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
8ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8ad0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
8ae0: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
8af0: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 20  of(*pExpr));.   
8b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
8b10: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  e(pDup);.       
8b20: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8b30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
8b40: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
8b50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
8b60: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
8b70: 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _2;.        }.  
8b80: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
8b90: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
8ba0: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
8bb0: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
8bc0: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
8bd0: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
8be0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
8bf0: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
8c00: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
8c10: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
8c20: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8c30: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
8c40: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
8c50: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
8c60: 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20   If X and Y are 
8c70: 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77  NULL (in other w
8c80: 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65  ords if only the
8c90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69   column name Z i
8ca0: 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29  s.  ** supplied)
8cb0: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
8cc0: 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  f Z is enclosed 
8cd0: 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  in double-quotes
8ce0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73  , then.  ** Z is
8cf0: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
8d00: 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  l if it doesn't 
8d10: 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e  match any column
8d20: 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74   names.  In that
8d30: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e  .  ** case, we n
8d40: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69  eed to return ri
8d50: 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74  ght away and not
8d60: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
8d70: 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e  s to.  ** pExpr.
8d80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75  .  **.  ** Becau
8d90: 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  se no reference 
8da0: 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65  was made to oute
8db0: 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20  r contexts, the 
8dc0: 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66  pNC->nRef.  ** f
8dd0: 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68  ields are not ch
8de0: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e  anged in any con
8df0: 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  text..  */.  if(
8e00: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
8e10: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
8e20: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
8e30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8e40: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
8e50: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
8e60: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
8e70: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
8e80: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
8e90: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
8ea0: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
8eb0: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
8ec0: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
8ed0: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
8ee0: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
8ef0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
8f00: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
8f10: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
8f20: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
8f30: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
8f40: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
8f50: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
8f60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f70: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
8f80: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
8f90: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
8fa0: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )0);.    }else i
8fb0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
8fc0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
8fd0: 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  g(&z, zTab, ".",
8fe0: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
8ff0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9000: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72     z = sqliteStr
9010: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
9020: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9030: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72  rMsg(pParse, zEr
9040: 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, z);.    sqlit
9050: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54  eFree(z);.    pT
9060: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
9070: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
9080: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
9090: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
90a0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
90b0: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
90c0: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
90d0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
90e0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
90f0: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
9100: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
9110: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
9120: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
9130: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
9140: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
9150: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
9160: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
9170: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
9180: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
9190: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
91a0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
91b0: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
91c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
91d0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
91e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
91f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
9200: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
9210: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
9220: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
9230: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
9240: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
9250: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
9260: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
9270: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
9280: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
9290: 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c  sk)1)<<n;.  }..l
92a0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
92b0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
92c0: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
92d0: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
92e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
92f0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
9300: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
9310: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
9320: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
9330: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
9340: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9350: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
9360: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
9370: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
9380: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
9390: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
93a0: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
93b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
93c0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
93d0: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
93e0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d  rse, pExpr, pNC-
93f0: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
9400: 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70  if( pMatch && !p
9410: 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29  Match->pSelect )
9420: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
9430: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
9440: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ab;.    }.    /*
9450: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
9460: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
9470: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
9480: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
9490: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
94a0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
94b0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
94c0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
94d0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
94e0: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
94f0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
9500: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
9510: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
9520: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
9530: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
9540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
9550: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9560: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
9570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9580: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
9590: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
95a0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
95b0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
95c0: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
95d0: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
95e0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
95f0: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
9600: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9610: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
9620: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
9630: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
9640: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
9650: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
9660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9670: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
9680: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
9690: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
96a0: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
96b0: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
96c0: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
96d0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
96e0: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
96f0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
9700: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
9710: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
9720: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
9730: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
9740: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
9750: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
9760: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
9770: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
9780: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
9790: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
97a0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
97b0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  >pParse;..  if( 
97c0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
97d0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
97e0: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
97f0: 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  1;.  ExprSetProp
9800: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
9810: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
9820: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
9830: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
9840: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
9850: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
9860: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
9870: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
9880: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
9890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
98a0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
98b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
98c0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
98d0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
98e0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
98f0: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
9900: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
9910: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
9920: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9930: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
9940: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
9950: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
9960: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
9970: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
9980: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
9990: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
99a0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
99b0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
99c0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
99d0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
99e0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
99f0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
9a00: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
9a10: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
9a20: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
9a30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
9a40: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
9a50: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
9a60: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
9a70: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
9a80: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
9a90: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
9aa0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
9ab0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
9ac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
9ad0: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
9ae0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
9af0: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
9b00: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
9b10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9b20: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
9b30: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
9b40: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
9b50: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
9b60: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
9b70: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
9b80: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
9b90: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
9ba0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
9bb0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
9bc0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
9bd0: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
9be0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
9bf0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
9c00: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
9c10: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
9c20: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
9c30: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
9c40: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
9c50: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
9c60: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
9c70: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
9c80: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
9c90: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
9ca0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
9cb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
9cd0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
9cf0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
9d00: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
9d10: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
9d20: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
9d30: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
9d40: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
9d50: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
9d60: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
9d70: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
9d80: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
9d90: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
9da0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9db0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
9dc0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
9dd0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
9de0: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
9e00: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
9e10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9e20: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
9e30: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
9e40: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
9e50: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
9e60: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
9e70: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
9e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
9e90: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
9ea0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
9eb0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
9ec0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
9ed0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
9ee0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
9ef0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
9f00: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
9f10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
9f20: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
9f30: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9f40: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
9f50: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
9f60: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
9f70: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  t i;.      int a
9f80: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
9f90: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72         /* Author
9fa0: 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74  ization to use t
9fb0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
9fc0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
9ff0: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
a000: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
a010: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a020: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
a030: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
a040: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
a050: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
a070: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a080: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
a090: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45       int enc = E
a0a0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
a0b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
a0c0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
a0d0: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
a0e0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
a0f0: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
a100: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
a110: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
a120: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
a130: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
a140: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
a150: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
a160: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
a170: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
a180: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
a190: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
a1a0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
a1b0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
a1c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
a1d0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
a1e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a1f0: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
a200: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
a210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a220: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
a230: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
a240: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
a250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a260: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
a270: 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20     if( pDef ){. 
a280: 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71         auth = sq
a290: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
a2a0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55  Parse, SQLITE_FU
a2b0: 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d  NCTION, 0, pDef-
a2c0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
a2d0: 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51      if( auth!=SQ
a2e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a2f0: 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53       if( auth==S
a300: 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20  QLITE_DENY ){.  
a310: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a320: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a330: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
a340: 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  d to use functio
a350: 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  n: %s",.        
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
a380: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a390: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a3a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
a3b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a3c0: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
a3d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a3e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a3f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
a400: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
a410: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
a420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a440: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
a450: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
a460: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
a470: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
a480: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
a490: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
a4a0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
a4b0: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
a4c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a4d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a4e0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
a4f0: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
a500: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
a510: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
a520: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
a530: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
a540: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a550: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
a560: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a570: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
a580: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
a590: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
a5a0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a5b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
a5c0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
a5d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
a5e0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
a5f0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
a600: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
a610: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a620: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
a630: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
a640: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
a650: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
a660: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
a670: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
a680: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
a690: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
a6a0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
a6b0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
a6c0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
a6d0: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
a6e0: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
a6f0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
a700: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
a710: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
a720: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
a730: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
a740: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
a750: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
a760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a770: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
a780: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
a790: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
a7a0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
a7b0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
a7c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
a7d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
a7e0: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
a7f0: 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Ref;.#ifndef SQL
a800: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
a810: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
a820: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
a830: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a840: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62  rMsg(pParse,"sub
a850: 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74  queries prohibit
a860: 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73  ed in CHECK cons
a870: 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20  traints");.     
a880: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
a890: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a8a0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
a8b0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
a8c0: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61   pNC);.        a
a8d0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66  ssert( pNC->nRef
a8e0: 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20  >=nRef );.      
a8f0: 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d    if( nRef!=pNC-
a900: 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20  >nRef ){.       
a910: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
a920: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
a930: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
a940: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
a960: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a970: 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65  T_CHECK.    case
a980: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
a990: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
a9a0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
a9b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a9c0: 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65  g(pParse,"parame
a9d0: 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20  ters prohibited 
a9e0: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
a9f0: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ints");.      }.
aa00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
aa20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
aa30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aa40: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
aa50: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
aa60: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
aa70: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
aa80: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
aa90: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
aaa0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
aab0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
aac0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
aad0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
aae0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
aaf0: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
ab00: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
ab10: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
ab20: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
ab30: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
ab40: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
ab50: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
ab60: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
ab70: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
ab80: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
ab90: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
aba0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
abb0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
abc0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
abd0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
abe0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
abf0: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
ac00: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
ac10: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
ac20: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
ac30: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
ac40: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
ac50: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
ac60: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
ac70: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
ac80: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
ac90: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
aca0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
acb0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
acc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
acd0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
ace0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
acf0: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
ad00: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
ad10: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
ad20: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
ad30: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
ad40: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
ad50: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
ad60: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
ad70: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
ad80: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
ad90: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
ada0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
adb0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
adc0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
add0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
ade0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
adf0: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
ae00: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
ae10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
ae20: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
ae30: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
ae40: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
ae50: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
ae60: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
ae70: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
ae80: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
ae90: 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d  lveNames( .  Nam
aea0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
aeb0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
aec0: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
aed0: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
aee0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
af00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
af10: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
af20: 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73  {.  int savedHas
af30: 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Agg;.  if( pExpr
af40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
af50: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
af60: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69 66  XPR_DEPTH>0.  if
af70: 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  ( (pExpr->nHeigh
af80: 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  t+pNC->pParse->n
af90: 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f 4d  Height)>SQLITE_M
afa0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 7b  AX_EXPR_DEPTH ){
afb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
afc0: 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73 65  rMsg(pNC->pParse
afd0: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
afe0: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
aff0: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
b000: 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20 20   depth %d)",.   
b010: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45      SQLITE_MAX_E
b020: 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29 3b  XPR_DEPTH.    );
b030: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b040: 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65   }.  pNC->pParse
b050: 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78  ->nHeight += pEx
b060: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
b070: 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41 67  dif.  savedHasAg
b080: 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67 3b  g = pNC->hasAgg;
b090: 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d  .  pNC->hasAgg =
b0a0: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
b0b0: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
b0c0: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
b0d0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
b0e0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
b0f0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65  pNC->pParse->nHe
b100: 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e  ight -= pExpr->n
b110: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
b120: 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30   if( pNC->nErr>0
b130: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
b140: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b150: 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20  P_Error);.  }.  
b160: 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  if( pNC->hasAgg 
b170: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
b180: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
b190: 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _Agg);.  }else i
b1a0: 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29  f( savedHasAgg )
b1b0: 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67  {.    pNC->hasAg
b1c0: 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 1;.  }.  ret
b1d0: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
b1e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
b1f0: 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ror);.}../*.** A
b200: 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63   pointer instanc
b210: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
b220: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70  ure is used to p
b230: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ass information.
b240: 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45  ** through walkE
b250: 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64  xprTree into cod
b260: 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e  eSubqueryStep().
b270: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
b280: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75  ct QueryCoder Qu
b290: 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74  eryCoder;.struct
b2a0: 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20   QueryCoder {.  
b2b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
b2c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b2d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b2e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
b2f0: 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61  C;    /* Namespa
b300: 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c  ce of first encl
b310: 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d  osing query */.}
b320: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ;.../*.** Genera
b330: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
b340: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
b350: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
b360: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
b370: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
b380: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
b390: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
b3a0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
b3b0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
b3c0: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
b3d0: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
b3e0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
b3f0: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
b410: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
b420: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
b430: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
b440: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
b450: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
b460: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
b470: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
b480: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
b490: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
b4a0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
b4b0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
b4c0: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
b4d0: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
b4e0: 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ery..*/.#ifndef 
b4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b500: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
b510: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
b520: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b530: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
b540: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
b570: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
b580: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
b590: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b5a0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
b5b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f   ) return;...  /
b5c0: 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74  * This code must
b5d0: 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65   be run in its e
b5e0: 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69  ntirety every ti
b5f0: 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
b600: 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79  ered.  ** if any
b610: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b620: 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
b630: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
b640: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
b650: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b660: 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
b670: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
b680: 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
b690: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
b6a0: 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
b6b0: 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
b6c0: 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
b6d0: 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
b6e0: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
b6f0: 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
b700: 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
b710: 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
b720: 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
b730: 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
b740: 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
b750: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
b760: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
b770: 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
b780: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
b790: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
b7a0: 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72  ) && !pParse->tr
b7b0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69  igStack ){.    i
b7c0: 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d  nt mem = pParse-
b7d0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
b7e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b7f0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
b800: 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41 64  , 0);.    testAd
b810: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
b820: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
b830: 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  0, 0);.    asser
b840: 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c  t( testAddr>0 ||
b850: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
b860: 69 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 73 71  iled() );.    sq
b870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b880: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
b890: 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  mem);.  }..  swi
b8a0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b8b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
b8c0: 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61  : {.      char a
b8d0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b  ffinity;.      K
b8e0: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a  eyInfo keyInfo;.
b8f0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
b900: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
b910: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
b920: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
b930: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
b940: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
b950: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
b960: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
b970: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
b980: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
b990: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
b9a0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
b9b0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
b9c0: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
b9d0: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
b9e0: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
b9f0: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
ba00: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
ba10: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
ba20: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
ba30: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
ba40: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
ba50: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
ba60: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
ba70: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
ba80: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
ba90: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
baa0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
bab0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
bac0: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
bad0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
bae0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
baf0: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
bb00: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
bb10: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
bb20: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
bb30: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
bb40: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
bb50: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
bb60: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
bb70: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
bb80: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
bb90: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
bba0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
bbb0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
bbc0: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
bbd0: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
bbe0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
bbf0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
bc00: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
bc10: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
bc20: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
bc30: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
bc40: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
bc50: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
bc60: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bc70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bc80: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
bc90: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
bca0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
bcb0: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
bcc0: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
bcd0: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
bce0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
bcf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bd00: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
bd10: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
bd20: 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  1);..      if( p
bd30: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
bd40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
bd50: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
bd60: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
bd70: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bd80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bd90: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
bda0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
bdb0: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
bdc0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
bdd0: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
bde0: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
bdf0: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
be00: 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d         int iParm
be10: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
be20: 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e   +  (((int)affin
be30: 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20  ity)<<16);.     
be40: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
be50: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ist;.        ass
be60: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
be70: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
be80: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
be90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
bea0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
beb0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
bec0: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
bed0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  rm, 0, 0, 0, 0) 
bee0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
bef0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
bf00: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
bf10: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
bf20: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
bf30: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
bf40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
bf50: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
bf60: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
bf70: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
bf80: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
bf90: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
bfa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bfb0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
bfc0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
bfd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
bfe0: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
bff0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
c000: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
c010: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
c020: 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20  **..** For each 
c030: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
c040: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
c050: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
c060: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
c070: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
c080: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c090: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
c0a0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
c0b0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
c0c0: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
c0d0: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
c0e0: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
c0f0: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
c100: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
c110: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
c120: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
c130: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
c140: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
c150: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
c160: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
c170: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c180: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c190: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ..        if( !a
c1a0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
c1b0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
c1c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
c1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c1e0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
c1f0: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  [0] = pExpr->pLe
c200: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  ft->pColl;..    
c210: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
c220: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
c230: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
c240: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  >. */.        fo
c250: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
c260: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
c270: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
c280: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
c290: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
c2a0: 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
c2b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
c2c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
c2d0: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
c2e0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
c2f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
c300: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
c310: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
c320: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
c330: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
c340: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
c350: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
c360: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
c370: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
c380: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
c390: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
c3a0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
c3b0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
c3c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c3d0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 30    if( testAddr>0
c3e0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
c3f0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
c400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
c410: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c420: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
c430: 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20  dr-1, 3);.      
c440: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
c450: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
c460: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
c470: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
c480: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
c490: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
c4a0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
c4b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c4c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
c4d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c4e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
c4f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
c500: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
c510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c520: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c530: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
c540: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
c550: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c560: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c570: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
c580: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
c590: 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
c5a0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  NFO);.      brea
c5b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
c5c0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
c5d0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
c5e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
c5f0: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
c600: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
c610: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
c620: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
c630: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
c640: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
c650: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
c660: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
c670: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
c680: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
c690: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
c6a0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
c6b0: 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75  Token one = { (u
c6c0: 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a  8*)"1", 0, 1 };.
c6d0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c6e0: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  el;.      int iM
c6f0: 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f  em;.      int so
c700: 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d  p;..      pExpr-
c710: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20  >iColumn = iMem 
c720: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
c730: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
c740: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
c750: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
c760: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
c770: 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53  .        sop = S
c780: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
c790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c7a0: 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
c7b0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
c7c0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c7d0: 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75 65  , "# Init subque
c7e0: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
c7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c800: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69     sop = SRT_Exi
c810: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
c820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c830: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
c840: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Mem);.        Vd
c850: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
c860: 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73   Init EXISTS res
c870: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
c880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c890: 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c  rDelete(pSel->pL
c8a0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
c8b0: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
c8c0: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47  te3Expr(TK_INTEG
c8d0: 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b  ER, 0, 0, &one);
c8e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c8f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c900: 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d   pSel, sop, iMem
c910: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b  , 0, 0, 0, 0) ){
c920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
c930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c950: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
c960: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c970: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
c980: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  stAddr);.  }..  
c990: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
c9a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c9b0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
c9c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
c9d0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
c9e0: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
c9f0: 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
ca00: 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
ca10: 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  1] on the stack.
ca20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca30: 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65  codeInteger(Vdbe
ca40: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
ca50: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61 73  *z, int n){.  as
ca60: 73 65 72 74 28 20 7a 20 7c 7c 20 73 71 6c 69 74  sert( z || sqlit
ca70: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
ca80: 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   );.  if( z ){. 
ca90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
caa0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
cab0: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
cac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cad0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
cae0: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , i, 0);.    }el
caf0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
cb00: 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b  tsIn64Bits(z) ){
cb10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cb20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36  beOp3(v, OP_Int6
cb30: 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  4, 0, 0, z, n);.
cb40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb50: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
cb60: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
cb70: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , z, n);.    }. 
cb80: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
cb90: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
cba0: 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
cbb0: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
cbc0: 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
cbd0: 20 70 54 61 62 20 61 6e 64 20 70 75 73 68 20 74   pTab and push t
cbe0: 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hat column value
cbf0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
cc00: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 6f  There.** is an o
cc10: 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
cc20: 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20 20 49  ab in iTable.  I
cc30: 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
cc40: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
cc50: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
cc60: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
cc70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cc80: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
cc90: 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a  Vdbe *v, Table *
cca0: 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 75 6d  pTab, int iColum
ccb0: 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  n, int iTable){.
ccc0: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
ccd0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
cce0: 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75  (pTab && IsVirtu
ccf0: 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56  al(pTab)) ? OP_V
cd00: 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64  Rowid : OP_Rowid
cd10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cd20: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54  eAddOp(v, op, iT
cd30: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  able, 0);.  }els
cd40: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
cd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cd60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
cd70: 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  mn, iTable, iCol
cd80: 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  umn);.  }else{. 
cd90: 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
cda0: 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
cdb0: 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
cdc0: 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
cdd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
cde0: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
cdf0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  n);.    sqlite3C
ce00: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
ce10: 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  pTab, iColumn);.
ce20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ce30: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
ce40: 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  NT.    if( pTab-
ce50: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
ce60: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
ce70: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
ce80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce90: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  Op(v, OP_RealAff
cea0: 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20  inity, 0, 0);.  
ceb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
cec0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ced0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
cee0: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
cef0: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
cf00: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
cf10: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
cf20: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
cf30: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  of stack..**.** 
cf40: 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
cf50: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
cf60: 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
cf70: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
cf80: 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
cf90: 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
cfa0: 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
cfb0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
cfc0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
cfd0: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
cfe0: 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
cff0: 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
d000: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
d010: 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
d020: 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
d030: 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
d040: 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
d050: 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
d060: 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
d070: 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
d080: 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
d090: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
d0a0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
d0b0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
d0c0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
d0d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d0e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
d0f0: 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63  t op;.  int stac
d100: 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a  kChng = 1;    /*
d110: 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67   Amount of chang
d120: 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68  e to stack depth
d130: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
d140: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d150: 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
d160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d170: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d180: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
d190: 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72    }.  op = pExpr
d1a0: 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
d1b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d1c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
d1d0: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
d1e0: 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
d1f0: 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
d200: 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
d210: 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
d220: 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
d230: 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
d240: 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
d250: 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
d260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
d280: 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c  oad, pCol->iMem,
d290: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
d2a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
d2b0: 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
d2c0: 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
d2d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d2e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d2f0: 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
d300: 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
d330: 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a  iSorterColumn);.
d340: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
d360: 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
d370: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
d380: 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
d390: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d3a0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
d3b0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
d3c0: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
d3d0: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
d3e0: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
d3f0: 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
d400: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
d410: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
d420: 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20  kOffset>0 );.   
d430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d440: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
d450: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
d460: 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t-pExpr->iColumn
d470: 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  -1, 1);.      }e
d480: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d490: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
d4a0: 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e  olumn(v, pExpr->
d4b0: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pTab, pExpr->iCo
d4c0: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
d4d0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
d4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d4f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
d500: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
d510: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
d520: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
d530: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
d540: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
d550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d560: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
d570: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
d580: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d590: 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c  K_FLOAT==OP_Real
d5a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d5b0: 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f  ( TK_STRING==OP_
d5c0: 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20  String8 );.     
d5d0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
d5e0: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
d5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d600: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63  (v, op, 0, 0, (c
d610: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
d620: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
d630: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
d640: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d650: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
d660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d670: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
d680: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
d690: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d6a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
d6b0: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
d6c0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
d6d0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
d6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
d6f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d700: 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c  K_BLOB==OP_HexBl
d710: 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ob );.      n = 
d720: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
d730: 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   3;.      z = (c
d740: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
d750: 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61  n.z + 2;.      a
d760: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
d770: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
d780: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b  .        z = "";
d790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d7a0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d7b0: 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29   op, 0, 0, z, n)
d7c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d7d0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d7e0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
d7f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d800: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d810: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
d820: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
d830: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
d840: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
d850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d860: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
d870: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
d880: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
d890: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  en.n);.      }. 
d8a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d8b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
d8c0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
d8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8e0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
d8f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
d900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d910: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
d920: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
d930: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
d940: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
d950: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
d960: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
d970: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
d980: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
d990: 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _op;.      sqlit
d9a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d9b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d9c0: 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
d9d0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
d9e0: 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29  e(&pExpr->token)
d9f0: 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
da00: 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
da10: 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
da20: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
da30: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
da40: 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
da50: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
da60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
da70: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
da80: 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
da90: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
daa0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dab0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
dac0: 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
dad0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
dae0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
daf0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
db00: 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
db10: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
db20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db30: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
db40: 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
db50: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
db60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f  VdbeAddOp(v, to_
db80: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
db90: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
dba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dbb0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
dbc0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
dbd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
dbe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
dbf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
dc00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
dc10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
dc20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
dc30: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
dc40: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
dc50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dc60: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
dc70: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dc80: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
dc90: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
dca0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
dcb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
dcc0: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
dcd0: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
dce0: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
dcf0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
dd00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
dd10: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
dd20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
dd30: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
dd40: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
dd50: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
dd60: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
dd70: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
dd80: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
dd90: 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  hng = -1;.      
dda0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ddb0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
ddc0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
ddd0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
dde0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
ddf0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
de00: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
de10: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
de20: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
de30: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
de40: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
de50: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
de60: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
de70: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
de80: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
de90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dea0: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
deb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dec0: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
ded0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
dee0: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
def0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
df00: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
df10: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
df20: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
df30: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
df40: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
df50: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
df60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
df70: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
df80: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
df90: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
dfa0: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
dfb0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
dfc0: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
dfd0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dfe0: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
dff0: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
e000: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
e010: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
e020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e030: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e040: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e060: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e070: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e090: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
e0a0: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
e0b0: 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  ng = -1;.      b
e0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e0d0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
e0e0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
e0f0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
e100: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
e110: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
e120: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
e130: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
e140: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
e150: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
e160: 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e  en *p = &pLeft->
e170: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63  token;.        c
e180: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
e190: 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73 22 2c  MPrintf("-%.*s",
e1a0: 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20   p->n, p->z);.  
e1b0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
e1c0: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e1e0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
e1f0: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70  Real, 0, 0, z, p
e200: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
e210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e220: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
e230: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
e240: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e250: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
e260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e270: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e280: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
e290: 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
e2a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
e2b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
e2c0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
e2d0: 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
e2e0: 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
e2f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
e300: 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
e310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e320: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e330: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
e340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e350: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
e360: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
e370: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
e380: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e390: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
e3a0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
e3b0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
e3c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e3d0: 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
e3e0: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
e3f0: 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
e400: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
e410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
e430: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
e440: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e450: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e460: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64  >pLeft);.      d
e470: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
e480: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
e490: 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 2;.      sqlit
e4a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
e4b0: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
e4c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e4d0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
e4e0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
e4f0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
e500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e510: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
e520: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
e530: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
e540: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
e550: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
e560: 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
e570: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e580: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
e590: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
e5a0: 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
e5b0: 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
e5c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e5e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
e5f0: 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46  mLoad, pInfo->aF
e600: 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
e610: 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  .iMem, 0);.     
e620: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e630: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e640: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
e650: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
e660: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
e670: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
e680: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
e690: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
e6a0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
e6b0: 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
e6c0: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
e6d0: 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
e6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
e6f0: 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  d;.      int con
e700: 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  stMask = 0;.    
e710: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
e720: 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
e730: 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 43  se->db);.      C
e740: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
e750: 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  0;.      zId = (
e760: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
e770: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
e780: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
e790: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
e7a0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
e7b0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
e7c0: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
e7d0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
e7e0: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
e7f0: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
e800: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
e810: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
e820: 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20  pList);.#ifndef 
e830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e840: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
e850: 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
e860: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
e870: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
e880: 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
e890: 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
e8a0: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
e8b0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
e8c0: 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
e8d0: 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
e8e0: 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
e8f0: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
e900: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
e910: 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
e920: 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
e930: 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
e940: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
e950: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
e960: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
e970: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
e980: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
e990: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
e9a0: 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
e9b0: 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
e9c0: 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
e9d0: 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
e9e0: 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
e9f0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ea00: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
ea10: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
ea20: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
ea30: 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
ea40: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
ea50: 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
ea60: 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
ea70: 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
ea80: 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
ea90: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
eaa0: 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
eab0: 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
eac0: 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
ead0: 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
eae0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
eaf0: 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
eb00: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
eb10: 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
eb20: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
eb30: 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
eb40: 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70 72  tion(pDef, nExpr
eb50: 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  , pList->a[1].pE
eb60: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
eb70: 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b  e if( nExpr>0 ){
eb80: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
eb90: 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
eba0: 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66  oadFunction(pDef
ebb0: 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
ebc0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
ebd0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ebe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
ebf0: 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
ec00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
ec10: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ec20: 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
ec30: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
ec40: 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
ec50: 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
ec60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
ec70: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
ec80: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
ec90: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
eca0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
ecb0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
ecc0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
ecd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ece0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
ecf0: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
ed00: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
ed10: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  ll ) pColl = pPa
ed20: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
ed30: 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
ed40: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ed50: 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
ed60: 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
ed70: 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ed90: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
eda0: 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
edb0: 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68 61  ask, nExpr, (cha
edc0: 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43  r*)pDef, P3_FUNC
edd0: 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63  DEF);.      stac
ede0: 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b  kChng = 1-nExpr;
edf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ee00: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ee10: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ee20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
ee30: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
ee40: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
ee50: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
ee60: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
ee70: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
ee80: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
ee90: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
eea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eeb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
eec0: 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  oad, pExpr->iCol
eed0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56  umn, 0);.      V
eee0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
eef0: 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20  # load subquery 
ef00: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
ef10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ef20: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
ef30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
ef40: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
ef50: 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  ity;.      int c
ef60: 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
ef70: 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20  ->ckOffset;.    
ef80: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
ef90: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
efa0: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
efb0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
efc0: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
efd0: 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
efe0: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
eff0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
f000: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
f010: 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
f020: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
f030: 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  suitable for.   
f040: 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d     ** P3 of OP_M
f050: 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20  akeRecord..     
f060: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69   */.      affini
f070: 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
f080: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
f090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f0a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f0b0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
f0c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66      pParse->ckOf
f0d0: 66 73 65 74 20 3d 20 28 63 6b 4f 66 66 73 65 74  fset = (ckOffset
f0e0: 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31 29 20   ? (ckOffset+1) 
f0f0: 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  : 0);..      /* 
f100: 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20  Code the <expr> 
f110: 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
f120: 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70  (...)". The temp
f130: 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20  orary table.    
f140: 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
f150: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
f160: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
f170: 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   up the (...) se
f180: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
f190: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f1a0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f1b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
f1c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f1d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
f1e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f1f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
f200: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b  tNull, -1, addr+
f210: 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  4);            /
f220: 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20  * addr + 0 */.  
f230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f240: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
f250: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
f260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f270: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
f280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f290: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
f2a0: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
f2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f2c0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
f2d0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
f2e0: 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a  finity, 1);   /*
f2f0: 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
f300: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f310: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
f320: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f330: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
f340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f350: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
f360: 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  , 0);           
f370: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
f380: 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65   6 */..      bre
f390: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f3a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
f3b0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
f3c0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
f3d0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
f3e0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f3f0: 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
f400: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a  Expr->pList->a;.
f410: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
f420: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
f430: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f440: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f450: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
f460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f470: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
f480: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f490: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f4a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
f4b0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
f4c0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
f4d0: 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b  t, OP_Ge, 0, 0);
f4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
f500: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
f510: 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
f520: 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
f530: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
f540: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f550: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
f560: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
f570: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
f580: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
f590: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
f5a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f5b0: 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a   OP_And, 0, 0);.
f5c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f5d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
f5e0: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  PLUS: {.      sq
f5f0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f600: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
f610: 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b  ft);.      stack
f620: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
f630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f640: 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
f650: 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f  .      int expr_
f660: 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20  end_label;.     
f670: 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20   int jumpInst;. 
f680: 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
f690: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
f6a0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
f6b0: 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  ist;.      struc
f6c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
f6d0: 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20  *aListelem;..   
f6e0: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
f6f0: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
f700: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
f710: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
f720: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
f730: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
f740: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
f750: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
f760: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
f770: 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
f780: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
f790: 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
f7a0: 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f  xpr;.      expr_
f7b0: 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69  end_label = sqli
f7c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f7d0: 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (v);.      if( p
f7e0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
f7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
f800: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f810: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f820: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
f830: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d  i=0; i<nExpr; i=
f840: 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
f850: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f860: 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
f870: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
f880: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
f890: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
f8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8b0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
f8c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
f8d0: 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d  mpInst = codeCom
f8e0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
f8f0: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74  pr->pLeft, aList
f900: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20  elem[i].pExpr,. 
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  OP_Ne, 0, 1);.  
f940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f950: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
f960: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
f970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f980: 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73      jumpInst = s
f990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f9a0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20  v, OP_IfNot, 1, 
f9b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
f9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f9d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
f9e0: 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
f9f0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
fa00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fa10: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70   OP_Goto, 0, exp
fa20: 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
fa30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fa40: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d  eJumpHere(v, jum
fa50: 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pInst);.      }.
fa60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
fa70: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
fa80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa90: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
faa0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
fab0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
fac0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
fad0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
fae0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
faf0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65  Right);.      }e
fb00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
fb10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fb20: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
fb30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fb40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
fb50: 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65  eLabel(v, expr_e
fb60: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
fb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
fb80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fb90: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
fba0: 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
fbb0: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
fbc0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
fbd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
fbe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
fc10: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
fc20: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
fc30: 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74  -program");..ret
fc40: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
fc50: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
fc60: 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65  olumn!=OE_Ignore
fc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
fc80: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
fc90: 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  umn==OE_Rollback
fca0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
fcb0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
fcc0: 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
fcd0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
fce0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
fcf0: 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b  mn == OE_Fail );
fd00: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
fd10: 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78  3DequoteExpr(pEx
fd20: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
fd30: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
fd40: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
fd50: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
fd60: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
fd90: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
fda0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
fdb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
fdc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
fdd0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
fde0: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe00: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
fe10: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
fe20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fe30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
fe40: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
fe50: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
fe60: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
fe70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
fe80: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
fe90: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
fea0: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
feb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fec0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
fed0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
fee0: 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  kOffset ){.    p
fef0: 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
ff00: 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20  += stackChng;.  
ff10: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
ff20: 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20  ->ckOffset );.  
ff30: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
ff40: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
ff50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ff60: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
ff70: 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
ff80: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
ff90: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
ffa0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
ffb0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
ffc0: 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a  ExprCode()..**.*
ffd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
ffe0: 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20  ight also cache 
fff0: 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d  the result and m
10000 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20  odify the pExpr 
10010 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  tree.** so that 
10020 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65  it will make use
10030 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72   of the cached r
10040 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
10050 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a  ent evaluations.
10060 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  ** rather than e
10070 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c  valuate the whol
10080 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
10090 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70  in.  Trivial exp
100a0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
100b0 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20  not cached.  If 
100c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
100d0 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65  s cached, its re
100e0 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
100f0 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c  n a .** memory l
10100 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ocation..*/.void
10110 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10120 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
10130 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
10140 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
10150 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10160 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
10170 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
10180 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
10190 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20  turn;.  addr1 = 
101a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
101b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c  ntAddr(v);.  sql
101c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
101d0 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61  rse, pExpr);.  a
101e0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
101f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10200 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
10210 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33  dr1+1 || sqlite3
10220 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
10230 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  r1)->opcode==OP_
10240 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
10250 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  iMem = pExpr->iT
10260 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
10270 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
10280 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10290 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
102a0 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  , 0);.    pExpr-
102b0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
102c0 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  R;.  }.}.#endif.
102d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
102e0 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
102f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
10300 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
10310 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
10320 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f  ession list onto
10330 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
10340 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10350 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
10360 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
10370 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stack..*/.int sq
10380 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
10390 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
103a0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
103b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
103c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
103d0 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ist    /* The ex
103e0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
103f0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a   be coded */.){.
10400 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10410 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
10420 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
10430 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
10440 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
10450 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
10460 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
10470 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  i=n; i>0; i--, p
10480 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
10490 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
104a0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
104b0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
104c0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
104d0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
104e0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
104f0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
10500 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
10510 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
10520 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
10530 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
10540 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
10550 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
10560 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
10570 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
10580 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10590 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
105a0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
105b0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
105c0 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
105d0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
105e0 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
105f0 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
10600 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
10610 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
10620 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
10630 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
10640 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
10650 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
10660 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
10670 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
10680 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
10690 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
106a0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
106b0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
106c0 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
106d0 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
106e0 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
106f0 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
10700 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
10710 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
10720 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
10730 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
10740 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
10750 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
10760 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10770 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
10780 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
10790 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
107a0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
107b0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
107c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
107d0 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
107e0 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
107f0 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
10800 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
10810 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
10820 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
10830 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
10840 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
10850 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
10860 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10870 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
10880 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10890 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
108a0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
108b0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
108c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
108d0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
108e0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
108f0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10910 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
10920 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10930 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10940 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
10950 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
10960 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10970 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
10980 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
10990 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
109a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
109b0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
109c0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
109d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
109e0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
109f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10a00 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10a10 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10a20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
10a30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10a40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10a50 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
10a60 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
10a70 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
10a80 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
10a90 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
10aa0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
10ab0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
10ac0 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
10ad0 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
10ae0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10af0 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
10b00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10b10 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
10b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10b30 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
10b40 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
10b50 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
10b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10b70 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10b80 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
10b90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10ba0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
10bb0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
10bc0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
10bd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
10be0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
10bf0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10c00 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
10c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10c20 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
10c30 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
10c40 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10c50 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
10c60 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
10c70 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
10c80 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
10c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10ca0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10cb0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
10cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10cd0 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
10ce0 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
10cf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10d00 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
10d10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
10d20 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
10d30 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
10d40 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
10d50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10d60 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
10d70 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
10d80 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
10d90 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
10da0 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
10db0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
10dc0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
10dd0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
10de0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
10df0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
10e00 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
10e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10e20 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10e30 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
10e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10e50 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
10e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10e70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
10e80 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
10e90 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
10ea0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
10eb0 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
10ec0 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
10ed0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
10ee0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
10ef0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
10f00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10f10 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
10f20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
10f30 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
10f40 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
10f50 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
10f60 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
10f70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10f80 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
10f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10fa0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10fb0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
10fc0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10fd0 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
10fe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10ff0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11000 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11010 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
11020 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
11030 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11040 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
11050 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
11060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11070 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
11080 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
11090 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
110a0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
110b0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
110c0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
110d0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
110e0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
110f0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
11100 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
11110 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
11120 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
11130 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
11140 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
11150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
11160 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
11170 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
11180 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
11190 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
111a0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
111b0 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
111c0 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
111d0 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
111e0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
111f0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
11200 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
11210 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
11220 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
11230 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11240 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11250 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b  op = 0;.  int ck
11260 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
11270 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  >ckOffset;.  if(
11280 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
11290 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
112a0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
112b0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
112c0 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
112d0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
112e0 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
112f0 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
11300 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
11310 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
11320 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
11330 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
11340 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
11350 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
11360 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
11370 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
11380 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
11390 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
113a0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
113b0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
113c0 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
113d0 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
113e0 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
113f0 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
11400 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
11410 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
11420 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
11430 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
11440 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
11450 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
11460 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
11470 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
11480 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
11490 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
114a0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
114b0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
114c0 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
114d0 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
114e0 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
114f0 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
11500 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
11510 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
11520 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
11530 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
11540 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
11550 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
11560 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
11570 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
11580 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
11590 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
115a0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
115b0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
115c0 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
115d0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
115e0 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
115f0 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
11600 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
11610 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
11620 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
11630 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
11640 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
11650 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
11660 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
11670 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
11680 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
11690 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
116a0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
116b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
116c0 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
116d0 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
116e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
116f0 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
11700 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
11710 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11720 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
11730 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
11740 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
11750 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
11760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
11770 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
11780 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
11790 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
117a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
117b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
117c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
117d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
117e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
117f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11800 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
11810 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
11820 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11830 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11840 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
11850 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
11860 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
11870 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11880 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11890 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
118a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
118b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
118c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
118d0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
118e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
118f0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
11900 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11910 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
11920 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
11930 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11950 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
11960 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
11970 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
11980 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
11990 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
119a0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
119b0 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
119c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
119d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
119e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
119f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11a00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
11a10 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11a20 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11a30 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
11a40 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
11a50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
11a60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11a70 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
11a80 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
11a90 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
11aa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11ab0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11ac0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
11ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11ae0 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
11af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11b00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11b10 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
11b20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
11b30 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
11b40 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
11b50 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
11b60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
11b70 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
11b80 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
11b90 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
11ba0 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
11bb0 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
11bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11bd0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
11be0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
11bf0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
11c00 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
11c10 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11c20 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
11c30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11c40 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
11c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c60 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
11c70 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
11c80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11c90 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
11ca0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
11cb0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11cc0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63  Addr(v);.      c
11cd0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
11ce0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
11cf0 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c  , OP_Ge, addr+3,
11d00 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
11d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
11d30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
11d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11d50 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
11d60 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67  est);.      pRig
11d70 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
11d80 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
11d90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11da0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
11db0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
11dc0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
11dd0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
11de0 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Gt, dest, jump
11df0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
11e00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11e10 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11e20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
11e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11e50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
11e60 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
11e70 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
11e80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
11e90 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
11ea0 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a  t = ckOffset;.}.
11eb0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
11ec0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
11ed0 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
11ee0 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
11ef0 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
11f00 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
11f10 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
11f20 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
11f30 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
11f40 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
11f50 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
11f60 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
11f70 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
11f80 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
11f90 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
11fa0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
11fb0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
11fc0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
11fd0 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
11fe0 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
11ff0 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
12000 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
12010 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
12020 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
12030 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
12040 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
12050 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
12060 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
12070 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
12080 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
12090 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
120a0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
120b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
120c0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
120d0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
120e0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
120f0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
12100 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
12110 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
12120 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
12130 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
12140 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
12150 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
12160 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
12170 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
12180 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
12190 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
121a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
121b0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
121c0 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
121d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
121e0 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
121f0 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
12200 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
12210 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
12220 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
12230 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
12240 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
12250 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
12260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12270 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
12280 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
12290 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
122a0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
122b0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
122c0 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
122d0 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
122e0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
122f0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
12300 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
12310 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
12320 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
12330 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
12340 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
12350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12360 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
12370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
12380 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
12390 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
123a0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
123b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
123c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
123d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
123e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
123f0 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
12400 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12410 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
12420 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
12430 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
12440 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
12450 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
12460 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
12470 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
12480 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
12490 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
124a0 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
124b0 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
124c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
124d0 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
124e0 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
124f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
12500 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
12510 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
12520 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
12530 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
12540 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
12550 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12560 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12570 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
12580 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
12590 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
125a0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
125b0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
125c0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
125d0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
125e0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
125f0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
12600 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12610 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
12620 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  n(AggInfo *pInfo
12630 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
12640 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
12650 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
12660 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  (.       pInfo->
12670 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
12680 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
12690 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
126a0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
126b0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
126c0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
126d0 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
126e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
126f0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
12700 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
12710 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
12720 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
12730 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
12740 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
12750 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
12760 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
12770 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
12780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12790 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 41  addAggInfoFunc(A
127a0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
127b0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
127c0 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
127d0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
127e0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
127f0 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
12800 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
12810 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
12820 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
12830 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  unc,.       &pIn
12840 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a  fo->nFuncAlloc,.
12850 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
12860 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
12870 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
12880 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
12890 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  kExprTree() used
128a0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
128b0 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  * sqlite3ExprAna
128c0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
128d0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
128e0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
128f0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
12900 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12910 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
12920 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
12930 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
12940 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a  ction at pExpr..
12950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
12960 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76  alyzeAggregate(v
12970 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
12980 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
12990 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
129a0 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
129b0 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61  ext *)pArg;.  Pa
129c0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
129d0 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
129e0 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
129f0 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
12a00 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
12a10 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
12a20 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69 74 63  nfo;.  ..  switc
12a30 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
12a40 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
12a50 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
12a60 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
12a70 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
12a80 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
12a90 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
12aa0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
12ab0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
12ac0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
12ad0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
12ae0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c 69        if( pSrcLi
12af0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  st ){.        st
12b00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12b10 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
12b20 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
12b30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
12b40 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
12b50 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
12b60 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
12b70 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
12b80 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
12b90 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
12ba0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
12bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
12bc0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
12bd0 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
12be0 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
12bf0 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
12c00 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
12c10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12c20 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
12c30 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
12c40 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
12c50 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
12c60 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
12c70 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
12c80 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
12c90 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
12ca0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
12cb0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
12cc0 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
12cd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
12ce0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
12cf0 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
12d00 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
12d10 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
12d20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
12d30 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
12d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12d50 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
12d60 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
12d70 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
12d80 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
12d90 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
12da0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
12db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12dc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12de0 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 70 41 67        if( k>=pAg
12df0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  gInfo->nColumn &
12e00 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
12e10 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66 6f  oColumn(pAggInfo
12e20 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))>=0 ){.       
12e30 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
12e40 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
12e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12e60 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
12e70 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
12e80 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
12e90 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
12ea0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
12eb0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
12ec0 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
12ed0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
12ee0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70    pCol->iMem = p
12ef0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
12f10 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
12f20 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
12f30 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
12f40 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
12f50 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
12f60 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
12f70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12f80 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
12f90 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
12fa0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
12fb0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12fe0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
12ff0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
13000 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
13010 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
13020 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
13030 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
13040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13050 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
13060 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
13090 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
130a0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
130b0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
130c0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
130d0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
130e0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13100 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
13110 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
13120 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13130 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
13140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13170 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
13180 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
13190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
131a0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
131b0 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
131c0 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
131d0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
131e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
131f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13200 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
13210 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
13220 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
13230 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
13240 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
13250 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
13260 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
13270 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
13280 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
13290 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
132a0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
132b0 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
132c0 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
132d0 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
132e0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
132f0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
13300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13310 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
13320 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
13330 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
13340 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
13350 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
13360 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
13370 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = k;.           
13380 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13390 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
133a0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
133b0 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
133c0 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
133d0 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
133e0 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
133f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13400 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13410 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
13420 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d       /* The pNC-
13430 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20  >nDepth==0 test 
13440 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65  causes aggregate
13450 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75   functions in su
13460 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a  bqueries.      *
13470 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20  * to be ignored 
13480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43  */.      if( pNC
13490 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
134a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
134b0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
134c0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
134d0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
134e0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
134f0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
13500 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
13510 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
13520 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
13530 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
13540 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
13550 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
13560 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
13570 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
13580 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
13590 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
135a0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
135b0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
135c0 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
135e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
135f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13600 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
13610 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
13620 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
13630 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
13640 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
13650 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
13660 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
13670 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
13680 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
13690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
136a0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
136b0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
136c0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
136d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
136e0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
136f0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
13700 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
13710 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
13720 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
13730 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
13740 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
13750 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
13760 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
13770 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
13780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13790 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
137a0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
137b0 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
137d0 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
137e0 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
137f0 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
13800 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13810 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13820 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
13830 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
13840 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
13850 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13860 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
13870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
13880 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
13890 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
138a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
138b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
138c0 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
138d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
138e0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
138f0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
13900 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13910 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
13920 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  = i;.        pEx
13930 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
13940 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
13950 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13970 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77  /* Recursively w
13980 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c  alk subqueries l
13990 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f  ooking for TK_CO
139a0 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20  LUMN nodes that 
139b0 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20  need.  ** to be 
139c0 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47  changed to TK_AG
139d0 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69  G_COLUMN.  But i
139e0 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20  ncrement nDepth 
139f0 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f  so that.  ** TK_
13a00 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
13a10 65 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  es in subqueries
13a20 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67   will be unchang
13a30 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13a40 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
13a50 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
13a60 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65  ++;.    walkSele
13a70 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53  ctExpr(pExpr->pS
13a80 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67  elect, analyzeAg
13a90 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
13aa0 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d     pNC->nDepth--
13ab0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
13ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
13ad0 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
13ae0 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
13af0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
13b00 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
13b10 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
13b20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
13b30 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
13b40 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
13b50 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
13b60 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
13b70 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
13b80 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
13b90 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
13ba0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
13bb0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
13bc0 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
13bd0 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
13be0 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
13bf0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
13c00 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  es()..**.** If e
13c10 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20  rrors are seen, 
13c20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
13c30 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73  essage in zErrMs
13c40 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  g and return.** 
13c50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
13c60 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
13c70 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13c80 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
13c90 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
13ca0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
13cb0 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72  nErr = pNC->pPar
13cc0 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b  se->nErr;.  walk
13cd0 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
13ce0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
13cf0 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e  , pNC);.  return
13d00 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
13d10 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  rr - nErr;.}../*
13d20 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
13d30 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
13d40 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
13d50 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
13d60 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
13d70 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
13d80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
13d90 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
13da0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
13db0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
13dc0 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69   cut short..*/.i
13dd0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
13de0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
13df0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
13e00 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
13e10 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
13e20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
13e30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
13e40 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
13e50 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
13e60 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
13e70 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
13e80 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13e90 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
13ea0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c       nErr += sql
13eb0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13ec0 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
13ed0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
13ee0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13ef0 20 6e 45 72 72 3b 0a 7d 0a                        nErr;.}.