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

Artifact de9f55b1baed00199466028ad96967208d487798:


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 33 30 30 20 32 30 30 37 2f 30 36 2f 32 35 20  .300 2007/06/25 
0220: 31 36 3a 32 39 3a 33 34 20 64 61 6e 69 65 6c 6b  16:29:34 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 69 6e 74 20 6f 70 3b 0a   ){.    int op;.
08e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
08f0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 6f 70  r->pColl;.    op
0900: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
0910: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 43 41    if( (op==TK_CA
0920: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
0930: 55 53 29 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  US) && !pColl ){
0940: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
0950: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0960: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
0970: 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pLeft);.    }.  
0980: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43  }.  if( sqlite3C
0990: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
09a0: 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20  se, pColl) ){ . 
09b0: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
09c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
09d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
09e0: 20 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f   is an operand o
09f0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
0a00: 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69  perator.  aff2 i
0a10: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
0a20: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74  finity of the ot
0a30: 68 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  her operand.  Th
0a40: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
0a50: 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  ns the.** type a
0a60: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0a70: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
0a80: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  the comparison o
0a90: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72  perator..*/.char
0aa0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
0ab0: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
0ac0: 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b  xpr, char aff2){
0ad0: 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73  .  char aff1 = s
0ae0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
0af0: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
0b00: 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b   aff1 && aff2 ){
0b10: 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64  .    /* Both sid
0b20: 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  es of the compar
0b30: 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ison are columns
0b40: 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d  . If one has num
0b50: 65 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69  eric.    ** affi
0b60: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
0b70: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
0b80: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
0b90: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
0ba0: 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  3IsNumericAffini
0bb0: 74 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69  ty(aff1) || sqli
0bc0: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
0bd0: 6e 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20  nity(aff2) ){.  
0be0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0bf0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
0c00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0c10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0c20: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  F_NONE;.    }.  
0c30: 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20  }else if( !aff1 
0c40: 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20  && !aff2 ){.    
0c50: 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20  /* Neither side 
0c60: 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  of the compariso
0c70: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n is a column.  
0c80: 43 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20  Compare the.    
0c90: 2a 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63  ** results direc
0ca0: 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
0cb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0cc0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  F_NONE;.  }else{
0cd0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65  .    /* One side
0ce0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
0cf0: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20  e other is not. 
0d00: 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  Use the columns 
0d10: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
0d20: 20 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30   assert( aff1==0
0d30: 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20   || aff2==0 );. 
0d40: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0d50: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0d60: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0d70: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0d80: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0d90: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0da0: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0db0: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0dc0: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0dd0: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0de0: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0df0: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0e00: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0e10: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0e20: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0e30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0e40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0e50: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0e60: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0e70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0e80: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0e90: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0ea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0eb0: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0ec0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0ed0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0ee0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0ef0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0f00: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0f10: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0f20: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0f30: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0f40: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0f50: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0f60: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0f70: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0f80: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0f90: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0fa0: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0fb0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0fc0: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0fd0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0fe0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0ff0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1020: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1030: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1040: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1050: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1060: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1070: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1080: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1090: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
10a0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
10b0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
10c0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
10d0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
10e0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
10f0: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1100: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1110: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1120: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1130: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1140: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1150: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1160: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1170: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1180: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1190: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
11b0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
11c0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
11d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
11e0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
11f0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1200: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1210: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1220: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1230: 20 52 65 74 75 72 6e 20 74 68 65 20 50 31 20 76   Return the P1 v
1240: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1250: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1260: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1270: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1280: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1290: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
12a0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
12b0: 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75  ..** If jumpIfNu
12c0: 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ll is true, then
12d0: 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62 79 74   set the low byt
12e0: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
12f0: 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20 74 6f  d.** P1 value to
1300: 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65   tell the opcode
1310: 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69 74 68   to jump if eith
1320: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
1330: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1340: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
1350: 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  t binaryCompareP
1360: 31 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20  1(Expr *pExpr1, 
1370: 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e  Expr *pExpr2, in
1380: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1390: 20 63 68 61 72 20 61 66 66 20 3d 20 73 71 6c 69   char aff = sqli
13a0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
13b0: 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74 75 72  pExpr2);.  retur
13c0: 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65 33 43  n ((int)sqlite3C
13d0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
13e0: 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28 6a 75  Expr1, aff))+(ju
13f0: 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30 3a 30  mpIfNull?0x100:0
1400: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1410: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1420: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1430: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1440: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1450: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1460: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1470: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1480: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
1490: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
14a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
14b0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
14c0: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
14d0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
14e0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
14f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1500: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
1510: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
1520: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1530: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1540: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1550: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1560: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1570: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
1580: 70 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20  pRight (but not 
1590: 70 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20  pLeft) may be a 
15a0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e  null pointer. In
15b0: 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
15c0: 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  t is not conside
15d0: 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 2a  red..*/.CollSeq*
15e0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
15f0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20  mpareCollSeq(.  
1600: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
1610: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a    Expr *pLeft, .
1620: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29    Expr *pRight.)
1630: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1640: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  ll;.  assert( pL
1650: 65 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65  eft );.  if( pLe
1660: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1670: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1680: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
1690: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f  pColl );.    pCo
16a0: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
16b0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
16c0: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
16d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
16e0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61 73  ollate ){.    as
16f0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 70 43  sert( pRight->pC
1700: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1710: 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c   = pRight->pColl
1720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1730: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1740: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1750: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
1760: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1770: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1780: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1790: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
17a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17b0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
17c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
17d0: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
17e0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
17f0: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1800: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1810: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1820: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
1830: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
1840: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1850: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
1860: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
1870: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
1880: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1890: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
18a0: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
18b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
18c0: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
18d0: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
18e0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
18f0: 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   if true.  */.  
1900: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1910: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75    /* If true, ju
1920: 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  mp if either ope
1930: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  rand is NULL */.
1940: 29 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69  ){.  int p1 = bi
1950: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c  naryCompareP1(pL
1960: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
1970: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c  pIfNull);.  Coll
1980: 53 65 71 20 2a 70 33 20 3d 20 73 71 6c 69 74 65  Seq *p3 = sqlite
1990: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
19a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
19b0: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
19c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
19d0: 62 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56  beOp3(pParse->pV
19e0: 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c  dbe, opcode, p1,
19f0: 20 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70 33   dest, (void*)p3
1a00: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d  , P3_COLLSEQ);.}
1a10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
1a20: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
1a30: 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75  on node and retu
1a40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a50: 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66  it.  Memory.** f
1a60: 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20  or this node is 
1a70: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1a80: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54  liteMalloc().  T
1a90: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1aa0: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ion.** is respon
1ab0: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
1ac0: 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65   sure the node e
1ad0: 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66  ventually gets f
1ae0: 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  reed..*/.Expr *s
1af0: 71 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20 6f  qlite3Expr(int o
1b00: 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  p, Expr *pLeft, 
1b10: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63 6f  Expr *pRight, co
1b20: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
1b30: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  n){.  Expr *pNew
1b40: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1b50: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
1b60: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
1b70: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  New==0 ){.    /*
1b80: 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   When malloc fai
1b90: 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74  ls, delete pLeft
1ba0: 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70   and pRight. Exp
1bb0: 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20  ressions passed 
1bc0: 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  to .    ** this 
1bd0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c  function must al
1be0: 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65  ways be allocate
1bf0: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78  d with sqlite3Ex
1c00: 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20  pr() for this . 
1c10: 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20     ** reason. . 
1c20: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1c30: 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  3ExprDelete(pLef
1c40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1c50: 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74  xprDelete(pRight
1c60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1c70: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
1c80: 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  = op;.  pNew->pL
1c90: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70  eft = pLeft;.  p
1ca0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  New->pRight = pR
1cb0: 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41  ight;.  pNew->iA
1cc0: 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  gg = -1;.  if( p
1cd0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  Token ){.    ass
1ce0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
1cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ==0 );.    pNew-
1d00: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
1d10: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
1d20: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
1d30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67   ){.    if( pRig
1d40: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
1d50: 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77  te3ExprSpan(pNew
1d60: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
1d70: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
1d80: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
1d90: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1da0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1db0: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1dc0: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
1dd0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
1de0: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1df0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
1e00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66    }.    if( pLef
1e10: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
1e20: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
1e30: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1e40: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
1e50: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c        pNew->pCol
1e60: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
1e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
1e80: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
1e90: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
1ea0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1eb0: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
1ec0: 6c 69 74 65 33 45 78 70 72 28 29 20 62 75 74 20  lite3Expr() but 
1ed0: 66 72 65 65 73 20 69 74 73 20 70 4c 65 66 74 20  frees its pLeft 
1ee0: 61 6e 64 20 70 52 69 67 68 74 20 61 72 67 75 6d  and pRight argum
1ef0: 65 6e 74 73 0a 2a 2a 20 69 66 20 69 74 20 66 61  ents.** if it fa
1f00: 69 6c 73 20 64 75 65 20 74 6f 20 61 20 6d 61 6c  ils due to a mal
1f10: 6c 6f 63 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  loc problem..*/.
1f20: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1f30: 72 4f 72 46 72 65 65 28 69 6e 74 20 6f 70 2c 20  rOrFree(int op, 
1f40: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1f50: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1f60: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1f70: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
1f80: 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 2c 20  sqlite3Expr(op, 
1f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70  pLeft, pRight, p
1fa0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e  Token);.  if( pN
1fb0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
1fc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1fd0: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1fe0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  e3ExprDelete(pRi
1ff0: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
2000: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2010: 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e  * When doing a n
2020: 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75  ested parse, you
2030: 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72   can include ter
2040: 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ms in an express
2050: 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b  ion.** that look
2060: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30   like this:   #0
2070: 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73   #1 #2 ...  Thes
2080: 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f  e terms refer to
2090: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20   elements.** on 
20a0: 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22  the stack.  "#0"
20b0: 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f   means the top o
20c0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20  f the stack..** 
20d0: 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e  "#1" means the n
20e0: 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20  ext down on the 
20f0: 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66  stack.  And so f
2100: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  orth..**.** This
2110: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2120: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
2130: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e   to deal with on
2140: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e   of those terms.
2150: 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65  .** It immediate
2160: 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ly generates cod
2170: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
2180: 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79  alue in a memory
2190: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68   location..** Th
21a0: 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70  e returns an exp
21b0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c  ression that wil
21c0: 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  l code to extrac
21d0: 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  t the value from
21e0: 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  .** that memory 
21f0: 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64  location as need
2200: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
2210: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
2220: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2230: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
2240: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2250: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
2260: 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70 74  r *p;.  int dept
2270: 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  h;.  if( pParse-
2280: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
2290: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22a0: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
22b0: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
22c0: 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  rror", pToken);.
22d0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
22e0: 65 33 45 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20  e3Expr(TK_NULL, 
22f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
2300: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2310: 6e 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  n 0;.  p = sqlit
2320: 65 33 45 78 70 72 28 54 4b 5f 52 45 47 49 53 54  e3Expr(TK_REGIST
2330: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
2340: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2350: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
2360: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
2370: 20 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20   */.  }.  depth 
2380: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70  = atoi((char*)&p
2390: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
23a0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  p->iTable = pPar
23b0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71  se->nMem++;.  sq
23c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
23d0: 2c 20 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c  , OP_Dup, depth,
23e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
23f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
2400: 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c  mStore, p->iTabl
2410: 65 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e, 1);.  return 
2420: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  p;.}../*.** Join
2430: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
2440: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
2450: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
2460: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
2470: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
2480: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
2490: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
24a0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
24b0: 33 45 78 70 72 41 6e 64 28 45 78 70 72 20 2a 70  3ExprAnd(Expr *p
24c0: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
24d0: 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74  ht){.  if( pLeft
24e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24f0: 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73  n pRight;.  }els
2500: 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20  e if( pRight==0 
2510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  ){.    return pL
2520: 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eft;.  }else{.  
2530: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2540: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65  Expr(TK_AND, pLe
2550: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
2560: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
2570: 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66   the Expr.span f
2580: 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
2590: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
25a0: 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74  span all.** text
25b0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
25c0: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a   given tokens..*
25d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
25e0: 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78  prSpan(Expr *pEx
25f0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74  pr, Token *pLeft
2600: 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29  , Token *pRight)
2610: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67  {.  assert( pRig
2620: 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ht!=0 );.  asser
2630: 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
2640: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c   if( !sqlite3Mal
2650: 6c 6f 63 46 61 69 6c 65 64 28 29 20 26 26 20 70  locFailed() && p
2660: 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66  Right->z && pLef
2670: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  t->z ){.    asse
2680: 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d  rt( pLeft->dyn==
2690: 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c  0 || pLeft->z[pL
26a0: 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20  eft->n]==0 );.  
26b0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e    if( pLeft->dyn
26c0: 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64  ==0 && pRight->d
26d0: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  yn==0 ){.      p
26e0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70  Expr->span.z = p
26f0: 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70  Left->z;.      p
2700: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  Expr->span.n = p
2710: 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67  Right->n + (pRig
2720: 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a  ht->z - pLeft->z
2730: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2740: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2750: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2770: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
2780: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
2790: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75  function with mu
27a0: 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65  ltiple.** argume
27b0: 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  nts..*/.Expr *sq
27c0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
27d0: 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  n(ExprList *pLis
27e0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
27f0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
2800: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2810: 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n );.  pNew = sq
2820: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2830: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
2840: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
2850: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2860: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f  Delete(pList); /
2870: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
2880: 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c  memory when mall
2890: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
28a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
28b0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55  pNew->op = TK_FU
28c0: 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e  NCTION;.  pNew->
28d0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
28e0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
28f0: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65  >dyn==0 );.  pNe
2900: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
2910: 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e  en;.  pNew->span
2920: 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a   = pNew->token;.
2930: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65  .  sqlite3ExprSe
2940: 74 48 65 69 67 68 74 28 70 4e 65 77 29 3b 0a 20  tHeight(pNew);. 
2950: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
2960: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
2970: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2980: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2990: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
29a0: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
29b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
29c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
29d0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
29e0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
29f0: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
2a00: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
2a10: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
2a20: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
2a30: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
2a40: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
2a50: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2a60: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
2a70: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
2a80: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
2a90: 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64   be to avoid a d
2aa0: 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65  enial of service
2ab0: 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20   attack when.** 
2ac0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2ad0: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20  t comes from an 
2ae0: 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e  external source.
2af0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
2b00: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61   of the form ":a
2b10: 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61 72  aa" or "$aaa" ar
2b20: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
2b30: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
2b40: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
2b50: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
2b60: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
2b70: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2b80: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
2b90: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
2ba0: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
2bb0: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
2bc0: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
2bd0: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
2be0: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
2bf0: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
2c00: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
2c10: 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70  xpr){.  Token *p
2c20: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78  Token;.  if( pEx
2c30: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2c40: 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70    pToken = &pExp
2c50: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  r->token;.  asse
2c60: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31  rt( pToken->n>=1
2c70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2c80: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  oken->z!=0 );.  
2c90: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2ca0: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
2cb0: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b   pToken->n==1 ){
2cc0: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2cd0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
2ce0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
2cf0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
2d00: 65 72 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d  er */.    pExpr-
2d10: 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72  >iTable = ++pPar
2d20: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73  se->nVar;.  }els
2d30: 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  e if( pToken->z[
2d40: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f  0]=='?' ){.    /
2d50: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2d60: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20  e form "?nnn".  
2d70: 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f  Convert "nnn" to
2d80: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a   an integer and.
2d90: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
2da0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
2db0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mber */.    int 
2dc0: 69 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  i;.    pExpr->iT
2dd0: 61 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28  able = i = atoi(
2de0: 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e  (char*)&pToken->
2df0: 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  z[1]);.    if( i
2e00: 3c 31 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d  <1 || i>SQLITE_M
2e10: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
2e20: 45 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER ){.      sqli
2e30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2e40: 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75  se, "variable nu
2e50: 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74  mber must be bet
2e60: 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22  ween ?1 and ?%d"
2e70: 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,.          SQLI
2e80: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
2e90: 4e 55 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20  NUMBER);.    }. 
2ea0: 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
2eb0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  >nVar ){.      p
2ec0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b  Parse->nVar = i;
2ed0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ee0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73      /* Wildcards
2ef0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61   of the form ":a
2f00: 61 61 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20  aa" or "$aaa".  
2f10: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
2f20: 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e  ariable.    ** n
2f30: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
2f40: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
2f50: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
2f60: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
2f70: 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20     ** has never 
2f80: 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c  appeared before,
2f90: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
2fa0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a  variable number.
2fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
2fc0: 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f  , n;.    n = pTo
2fd0: 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28  ken->n;.    for(
2fe0: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
2ff0: 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  VarExpr; i++){. 
3000: 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
3010: 20 20 20 20 20 69 66 28 20 28 70 45 20 3d 20 70       if( (pE = p
3020: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3030: 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20  [i])!=0.        
3040: 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e    && pE->token.n
3050: 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==n.          &&
3060: 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65   memcmp(pE->toke
3070: 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  n.z, pToken->z, 
3080: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
3090: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
30a0: 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pE->iTable;.   
30b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
30c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
30d0: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  ( i>=pParse->nVa
30e0: 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  rExpr ){.      p
30f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
3100: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
3110: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
3120: 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73  >nVarExpr>=pPars
3130: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
3140: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  -1 ){.        pP
3150: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
3160: 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e  loc += pParse->n
3170: 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31  VarExprAlloc + 1
3180: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  0;.        pPars
3190: 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 20 73  e->apVarExpr = s
31a0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72  qliteReallocOrFr
31b0: 65 65 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  ee(pParse->apVar
31c0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
31e0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
31f0: 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  oc*sizeof(pParse
3200: 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 20  ->apVarExpr[0]) 
3210: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3220: 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c   if( !sqlite3Mal
3230: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
3240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
3250: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3260: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
3270: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3280: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
3290: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
32a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
32b0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
32c0: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
32d0: 6e 56 61 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nVar>SQLITE_MAX_
32e0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
32f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3300: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3310: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
3320: 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a  iables");.  }.}.
3330: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
3340: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
3350: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
3360: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
3370: 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29  rDelete(Expr *p)
3380: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
3390: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
33a0: 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  span.dyn ) sqlit
33b0: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
33c0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70  span.z);.  if( p
33d0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
33e0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
33f0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
3400: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3410: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
3420: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3430: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
3440: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3450: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
3460: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3470: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
3480: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
3490: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
34a0: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
34b0: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
34c0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
34d0: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
34e0: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
34f0: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
3500: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3510: 44 65 71 75 6f 74 65 45 78 70 72 28 45 78 70 72  DequoteExpr(Expr
3520: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
3530: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
3540: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29  , EP_Dequoted) )
3550: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3560: 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  }.  ExprSetPrope
3570: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3580: 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  ed);.  if( p->to
3590: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ken.dyn==0 ){.  
35a0: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
35b0: 70 79 28 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70  py(&p->token, &p
35c0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  ->token);.  }.  
35d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28  sqlite3Dequote((
35e0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
35f0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
3600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
3610: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
3620: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
3630: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
3640: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3650: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
3660: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3670: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
3680: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
3690: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
36a0: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
36b0: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
36c0: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
36d0: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
36e0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
36f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
3700: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
3710: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
3720: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
3730: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
3740: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
3750: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
3760: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
3770: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3780: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3790: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
37a0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
37b0: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
37c0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
37d0: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
37e0: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
37f0: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3800: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3810: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
3820: 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  p(Expr *p){.  Ex
3830: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
3840: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3850: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3860: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3870: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3880: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3890: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
38a0: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
38b0: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
38c0: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
38d0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
38e0: 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72 4e 44  (u8*)sqliteStrND
38f0: 75 70 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  up((char*)p->tok
3900: 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  en.z, p->token.n
3910: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
3920: 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  en.dyn = 1;.  }e
3930: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
3940: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d   pNew->token.z==
3950: 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  0 );.  }.  pNew-
3960: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70  >span.z = 0;.  p
3970: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
3980: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3990: 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Left);.  pNew->p
39a0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
39b0: 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74  xprDup(p->pRight
39c0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  );.  pNew->pList
39d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
39e0: 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b  stDup(p->pList);
39f0: 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  .  pNew->pSelect
3a00: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
3a10: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
3a20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3a30: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
3a40: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
3a50: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
3a60: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3a70: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
3a80: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
3a90: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
3aa0: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
3ab0: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
3ac0: 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  >z = (u8*)sqlite
3ad0: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
3ae0: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
3af0: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
3b00: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3b10: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
3b20: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
3b30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3b40: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
3b50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
3b60: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3b70: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3b80: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3b90: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3ba0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3bb0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3bc0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3bd0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3be0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3bf0: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
3c00: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3c10: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
3c20: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
3c30: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70  eMalloc( p->nExp
3c40: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
3c50: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
3c60: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3c70: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
3c80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
3c90: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
3ca0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
3cb0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
3cc0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
3cd0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3ce0: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
3cf0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
3d00: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
3d10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3d20: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  (pOldExpr = pOld
3d30: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
3d40: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
3d50: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
3d60: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
3d70: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3d80: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3d90: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
3da0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3db0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
3dc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
3dd0: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
3de0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
3df0: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
3e00: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
3e10: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3e20: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
3e30: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
3e40: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3e50: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
3e60: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
3e70: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
3e80: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3e90: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
3ea0: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
3eb0: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
3ec0: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
3ed0: 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  pan.z==0.       
3ee0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d       || sqlite3M
3ef0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
3f00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
3f10: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
3f20: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
3f30: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
3f40: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
3f50: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
3f60: 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20     pItem->isAgg 
3f70: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67  = pOldItem->isAg
3f80: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
3f90: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
3fa0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3fb0: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
3fc0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
3fd0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
3fe0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
3ff0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
4000: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
4010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
4020: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
4030: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
4040: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
4050: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
4060: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
4070: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
4080: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
4090: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
40a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
40b0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
40c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
40d0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
40e0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
40f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
4100: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
4110: 33 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  3SrcListDup(SrcL
4120: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
4130: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
4140: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
4150: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4160: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
4170: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
4180: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
4190: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
41a0: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
41b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
41c0: 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29  llocRaw( nByte )
41d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
41e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
41f0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
4200: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
4210: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
4220: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
4230: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
4240: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
4250: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
4260: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4270: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4280: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4290: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
42a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
42b0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53  tabase = sqliteS
42c0: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
42d0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
42e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
42f0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4300: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4310: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
4320: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74  Alias = sqliteSt
4330: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
4340: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
4350: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
4360: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
4370: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
4380: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
4390: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
43a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
43b0: 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64  Populated = pOld
43c0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
43d0: 64 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e  d;.    pTab = pN
43e0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
43f0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
4400: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
4410: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
4420: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
4430: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
4440: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4450: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  p(pOldItem->pSel
4460: 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ect);.    pNewIt
4470: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
4480: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65  3ExprDup(pOldIte
4490: 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65  m->pOn);.    pNe
44a0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
44b0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
44c0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e  (pOldItem->pUsin
44d0: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
44e0: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
44f0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
4500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4510: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
4520: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
4530: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
4540: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
4550: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4560: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
4570: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
4580: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
4590: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
45a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
45b0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
45c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
45d0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
45e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
45f0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
4600: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
4610: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
4620: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65    sqliteFree(pNe
4630: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
4640: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4650: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
4660: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4670: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4680: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4690: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
46a0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
46b0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
46c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
46d0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
46e0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
46f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4700: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
4710: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
4720: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
4730: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4740: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
4750: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
4760: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4770: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
4780: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
4790: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
47a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
47b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
47c0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
47d0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
47e0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
47f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4800: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
4810: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
4820: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
4830: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
4840: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
4850: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
4860: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
4870: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
4880: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
4890: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
48a0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
48b0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
48c0: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
48d0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
48e0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
48f0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
4900: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
4910: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
4920: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4930: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4940: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
4950: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
4960: 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Limit);.  pNew->
4970: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
4980: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66  3ExprDup(p->pOff
4990: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
49a0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
49b0: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
49c0: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
49d0: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
49e0: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
49f0: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4a00: 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20   pNew->usesEphm 
4a10: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
4a20: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
4a30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
4a40: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
4a50: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
4a60: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
4a70: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
4a80: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4a90: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
4aa0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
4ab0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
4ac0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4ad0: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
4ae0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
4af0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4b00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
4b10: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
4b20: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
4b30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
4b40: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
4b50: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
4b60: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
4b70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
4b80: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
4b90: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
4ba0: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
4bb0: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
4bc0: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
4bd0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
4be0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
4bf0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
4c00: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
4c10: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
4c20: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
4c30: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4c40: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
4c50: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
4c60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
4c70: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
4c80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
4c90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4ca0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74  item *a;.    int
4cb0: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   n = pList->nAll
4cc0: 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20  oc*2 + 4;.    a 
4cd0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4ce0: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
4cf0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
4d00: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
4d10: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4d20: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
4d30: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
4d40: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
4d50: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
4d60: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
4d70: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
4d80: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
4d90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4da0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
4db0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
4dc0: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
4dd0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
4de0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
4df0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
4e00: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4e10: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
4e20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4e30: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
4e40: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
4e50: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
4e60: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
4e70: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
4e80: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
4e90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4ea0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
4eb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4ec0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
4ed0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
4ee0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
4ef0: 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69  st pEList contai
4f00: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69  ns more than iLi
4f10: 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a  mit elements,.**
4f20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
4f30: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
4f40: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
4f50: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
4f60: 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a  ength(.  Parse *
4f70: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
4f80: 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 69 6e  st *pEList,.  in
4f90: 74 20 69 4c 69 6d 69 74 2c 0a 20 20 63 6f 6e 73  t iLimit,.  cons
4fa0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
4fb0: 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  ){.  if( pEList 
4fc0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
4fd0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
4fe0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4ff0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
5000: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
5010: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
5020: 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ...#if SQLITE_MA
5030: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
5040: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5050: 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c  three functions,
5060: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c   heightOfExpr(),
5070: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
5080: 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68  t().** and heigh
5090: 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65  tOfSelect(), are
50a0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
50b0: 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  ne the maximum h
50c0: 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20  eight.** of any 
50d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
50e0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
50f0: 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  e structure pass
5100: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72  ed as the.** fir
5110: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
5120: 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d  ** If this maxim
5130: 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72 65  um height is gre
5140: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
5150: 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e  rrent value poin
5160: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48  ted.** to by pnH
5170: 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e  eight, the secon
5180: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65  d parameter, the
5190: 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20  n set *pnHeight 
51a0: 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
51b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51c0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45 78   heightOfExpr(Ex
51d0: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  pr *p, int *pnHe
51e0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
51f0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65  {.    if( p->nHe
5200: 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29  ight>*pnHeight )
5210: 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68  {.      *pnHeigh
5220: 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a  t = p->nHeight;.
5230: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
5240: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5250: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
5260: 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69  t *p, int *pnHei
5270: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ght){.  if( p ){
5280: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
5290: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
52a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
52b0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
52c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48  >a[i].pExpr, pnH
52d0: 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  eight);.    }.  
52e0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
52f0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53  heightOfSelect(S
5300: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70  elect *p, int *p
5310: 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20  nHeight){.  if( 
5320: 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  p ){.    heightO
5330: 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  fExpr(p->pWhere,
5340: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5350: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5360: 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68  pHaving, pnHeigh
5370: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5380: 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  Expr(p->pLimit, 
5390: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
53a0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
53b0: 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74  Offset, 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 45 4c 69 73  xprList(p->pELis
53e0: 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  t, pnHeight);.  
53f0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5400: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
5410: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
5420: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
5430: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48  p->pOrderBy, pnH
5440: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5450: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50  htOfSelect(p->pP
5460: 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b  rior, pnHeight);
5470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
5480: 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67  t the Expr.nHeig
5490: 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74  ht variable in t
54a0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
54b0: 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72  sed as an .** ar
54c0: 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65  gument. An expre
54d0: 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68  ssion with no ch
54e0: 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69  ildren, Expr.pLi
54f0: 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70  st or .** Expr.p
5500: 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61  Select member ha
5510: 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e  s a height of 1.
5520: 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   Any other expre
5530: 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68  ssion.** has a h
5540: 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74  eight equal to t
5550: 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68  he maximum heigh
5560: 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a  t of any other .
5570: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45 78  ** referenced Ex
5580: 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f 0a  pr plus one..*/.
5590: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
55a0: 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20 2a  SetHeight(Expr *
55b0: 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68  p){.  int nHeigh
55c0: 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f  t = 0;.  heightO
55d0: 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  fExpr(p->pLeft, 
55e0: 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69  &nHeight);.  hei
55f0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52 69  ghtOfExpr(p->pRi
5600: 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ght, &nHeight);.
5610: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69    heightOfExprLi
5620: 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e 48  st(p->pList, &nH
5630: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
5640: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65 6c  OfSelect(p->pSel
5650: 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  ect, &nHeight);.
5660: 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e    p->nHeight = n
5670: 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f  Height + 1;.}../
5680: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5690: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
56a0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
56b0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
56c0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
56d0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
56e0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
56f0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5700: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
5710: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
5720: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
5730: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
5740: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
5750: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
5760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5770: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
5780: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
5790: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
57a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
57b0: 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  e(ExprList *pLis
57c0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
57d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
57e0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
57f0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
5800: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
5810: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70  List->a!=0 || (p
5820: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26  List->nExpr==0 &
5830: 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  & pList->nAlloc=
5840: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
5850: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70   pList->nExpr<=p
5860: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  List->nAlloc );.
5870: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
5880: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
5890: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
58a0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
58b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
58c0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
58d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
58e0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
58f0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
5900: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
5910: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
5920: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
5930: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
5940: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
5950: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
5960: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
5970: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
5980: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
5990: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
59a0: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
59b0: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
59c0: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
59d0: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
59e0: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
59f0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
5a00: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
5a10: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
5a20: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
5a30: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
5a40: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
5a50: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
5a60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
5a70: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
5a80: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
5a90: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
5aa0: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
5ab0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
5ac0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
5ad0: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
5ae0: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
5af0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5b00: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
5b10: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
5b20: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
5b30: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
5b40: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
5b50: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
5b60: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
5b70: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
5b80: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
5b90: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
5ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
5bb0: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
5bc0: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
5bd0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
5be0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
5bf0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
5c00: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
5c10: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
5c20: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
5c30: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
5c40: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
5c50: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
5c60: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
5c70: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
5c80: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
5c90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
5ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
5cb0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
5cc0: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
5cd0: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
5ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
5cf0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
5d00: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
5d10: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
5d20: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
5d30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5d40: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
5d50: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
5d60: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
5d70: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
5d80: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
5d90: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
5da0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
5db0: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
5dc0: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
5dd0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
5de0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5df0: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
5e00: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
5e10: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
5e20: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
5e30: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
5e40: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
5e50: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
5e60: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
5e70: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
5e80: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
5e90: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
5ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
5eb0: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
5ec0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
5ed0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
5ee0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
5ef0: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
5f00: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
5f10: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
5f20: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
5f30: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
5f40: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
5f50: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
5f60: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
5f70: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
5f80: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
5f90: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
5fa0: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
5fb0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5fc0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
5fd0: 7b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  {.    walkSelect
5fe0: 45 78 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20  Expr(p->pPrior, 
5ff0: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
6000: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6020: 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64  tine is designed
6030: 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   as an xFunc for
6040: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e   walkExprTree().
6050: 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72  .**.** pArg is r
6060: 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  eally a pointer 
6070: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  to an integer.  
6080: 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62  If we can tell b
6090: 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20  y looking.** at 
60a0: 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20 65  pExpr that the e
60b0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
60c0: 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69 73  ontains pExpr is
60d0: 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a   not a constant.
60e0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  ** expression, t
60f0: 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f  hen set *pArg to
6100: 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20   0 and return 2 
6110: 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74  to abandon the t
6120: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20  ree walk..** If 
6130: 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20  pExpr does does 
6140: 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20 74  not disqualify t
6150: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  he expression fr
6160: 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74  om being a const
6170: 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e  ant.** then do n
6180: 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66  othing..**.** Af
6190: 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  ter walking the 
61a0: 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e  whole tree, if n
61b0: 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e  o nodes are foun
61c0: 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69 66  d that disqualif
61d0: 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  y.** the express
61e0: 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c  ion as constant,
61f0: 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20   then we assume 
6200: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
6210: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74  sion.** is const
6220: 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ant.  See sqlite
6230: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6240: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
6250: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
6260: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
6270: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76  NodeIsConstant(v
6280: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
6290: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a  *pExpr){.  int *
62a0: 70 4e 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  pN = (int*)pArg;
62b0: 0a 0a 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20  ..  /* If *pArg 
62c0: 69 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65  is 3 then any te
62d0: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
62e0: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
62f0: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
6300: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6310: 73 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71  s of a join disq
6320: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
6330: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
6340: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
6350: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
6360: 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26    if( (*pN)==3 &
6370: 26 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  & ExprHasAnyProp
6380: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6390: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
63a0: 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  *pN = 0;.    ret
63b0: 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77  urn 2;.  }..  sw
63c0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
63d0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
63e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
63f0: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
6400: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
6410: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
6420: 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67      ** and *pArg
6430: 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ==2 */.    case 
6440: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
6450: 20 20 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20     if( (*pN)==2 
6460: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6470: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6480: 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  h */.    case TK
6490: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
64a0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
64b0: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
64c0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
64d0: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
64e0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e  AGG_COLUMN:.#ifn
64f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6500: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6510: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
6520: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
6530: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 70  .#endif.      *p
6540: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  N = 0;.      ret
6550: 75 72 6e 20 32 3b 0a 20 20 20 20 63 61 73 65 20  urn 2;.    case 
6560: 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20 69 66 28  TK_IN:.      if(
6570: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
6580: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4e 20 3d  ){.        *pN =
6590: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
65a0: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
65b0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
65c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
65d0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
65e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
65f0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
6600: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6610: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
6620: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
6630: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
6640: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
6650: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
6660: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
6670: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
6680: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
6690: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
66a0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
66b0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
66c0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
66d0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
66e0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
66f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6700: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
6710: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6720: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
6730: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6740: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6750: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6760: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
6770: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
6780: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
6790: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
67a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
67b0: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
67c0: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
67d0: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
67e0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
67f0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
6800: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
6810: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
6820: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
6830: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
6840: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
6850: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
6860: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6870: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
6880: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
6890: 73 74 20 3d 20 33 3b 0a 20 20 77 61 6c 6b 45 78  st = 3;.  walkEx
68a0: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
68b0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
68c0: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
68d0: 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a  n isConst!=0;.}.
68e0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
68f0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
6900: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
6910: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
6920: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20  onstant.** or a 
6930: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69  function call wi
6940: 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  th constant argu
6950: 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61  ments.  Return a
6960: 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a  nd 0 if there.**
6970: 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c   are any variabl
6980: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
6990: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
69a0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
69b0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
69c0: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
69d0: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
69e0: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
69f0: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
6a00: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
6a10: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
6a20: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
6a30: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6a40: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  tOrFunction(Expr
6a50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
6a60: 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45  nst = 2;.  walkE
6a70: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
6a80: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
6a90: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
6aa0: 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d  rn isConst!=0;.}
6ab0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
6ac0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
6ad0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
6ae0: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
6af0: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
6b00: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
6b10: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
6b20: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
6b30: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
6b40: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
6b50: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
6b60: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
6b70: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
6b80: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
6b90: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
6ba0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6bb0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
6bc0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
6bd0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
6be0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6bf0: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
6c00: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74  *pValue){.  swit
6c10: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
6c20: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
6c30: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
6c40: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28 63  lite3GetInt32((c
6c50: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c  har*)p->token.z,
6c60: 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   pValue) ){.    
6c70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6c90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6ca0: 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20  e TK_UPLUS: {.  
6cb0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
6cc0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
6cd0: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
6ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
6cf0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
6d00: 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20       int v;.    
6d10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
6d20: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
6d30: 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  eft, &v) ){.    
6d40: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
6d50: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
6d60: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6d80: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
6d90: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
6da0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
6db0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
6dc0: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
6dd0: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
6de0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
6df0: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
6e00: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
6e10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6e20: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
6e30: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6e40: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6e50: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
6e60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6e70: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6e80: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
6e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
6ea0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6eb0: 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
6ec0: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  f a column of th
6ed0: 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  e form X.Y.Z or 
6ee0: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c  Y.Z or just Z, l
6ef0: 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e  ook up.** that n
6f00: 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f  ame in the set o
6f10: 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  f source tables 
6f20: 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20  in pSrcList and 
6f30: 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a  make the pExpr .
6f40: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
6f50: 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f  de refer back to
6f60: 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c   that source col
6f70: 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  umn.  The follow
6f80: 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  ing changes.** a
6f90: 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72  re made to pExpr
6fa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72  :.**.**    pExpr
6fb0: 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20  ->iDb           
6fc0: 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Set the index in
6fd0: 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68   db->aDb[] of th
6fe0: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
6ff0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
7010: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
7020: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
7030: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7040: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7050: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
7060: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7080: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
7090: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
70a0: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
70b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
70c0: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
70d0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
70e0: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
70f0: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
7100: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
7110: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
7120: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
7130: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
7140: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
7150: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
7160: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
7170: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
7180: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
7190: 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20  The pDbToken is 
71a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
71b0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22 58  database (the "X
71c0: 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ").  This value 
71d0: 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d  may be.** NULL m
71e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65  eaning that name
71f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7200: 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61  Y.Z or Z.  Any a
7210: 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73  vailable databas
7220: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
7230: 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b  .  The pTableTok
7240: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
7250: 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65  f the table (the
7260: 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20   "Y").  This.** 
7270: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c  value can be NUL
7280: 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73  L if pDbToken is
7290: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
72a0: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e  pTableToken is N
72b0: 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ULL it.** means 
72c0: 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66  that the form of
72d0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61   the name is Z a
72e0: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  nd that columns 
72f0: 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a  from any table.*
7300: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  * can be used..*
7310: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65  *.** If the name
7320: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c   cannot be resol
7330: 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c  ved unambiguousl
7340: 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  y, leave an erro
7350: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
7360: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
7370: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74  n non-zero.  Ret
7380: 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  urn zero on succ
7390: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
73a0: 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20  nt lookupName(. 
73b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
73c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
73d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
73e0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
73f0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
7400: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
7410: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
7420: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
7430: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
7440: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
7450: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
7460: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
7470: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
7480: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
7490: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
74a0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
74b0: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
74c0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73   name context us
74d0: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ed to resolve th
74e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
74f0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
7500: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
7510: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
7520: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
7530: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
7540: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
7550: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7560: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
7570: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
7580: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
7590: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
75a0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
75b0: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
75c0: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
75d0: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
75e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
75f0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
7600: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
7610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7620: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
7630: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
7640: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7650: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
7660: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
7670: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
7680: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7690: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
76a0: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  mes */.  sqlite3
76b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
76c0: 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
76d0: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
76e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
76f0: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
7700: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
7710: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
7720: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
7730: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
7740: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
7750: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
7760: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
7770: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
7780: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
7790: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
77a0: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
77b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
77c0: 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f  lumnToken && pCo
77d0: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20  lumnToken->z ); 
77e0: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
77f0: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
7800: 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69   */.  zDb = sqli
7810: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7820: 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54  (pDbToken);.  zT
7830: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
7840: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
7850: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
7860: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7870: 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b  Token(pColumnTok
7880: 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  en);.  if( sqlit
7890: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
78a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f   ){.    goto loo
78b0: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d  kupname_end;.  }
78c0: 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ..  pExpr->iTabl
78d0: 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28  e = -1;.  while(
78e0: 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29   pNC && cnt==0 )
78f0: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
7900: 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c  pEList;.    SrcL
7910: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
7920: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a  pNC->pSrcList;..
7930: 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74      if( pSrcList
7940: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
7950: 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73  0, pItem=pSrcLis
7960: 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74  t->a; i<pSrcList
7970: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
7980: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54  em++){.        T
7990: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
79a0: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
79b0: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
79c0: 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54  l;.  .        pT
79d0: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
79e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
79f0: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
7a00: 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
7a10: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
7a20: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
7a30: 61 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  a);.        asse
7a40: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
7a50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7a60: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  zTab ){.        
7a70: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
7a80: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
7a90: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
7aa0: 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  e = pItem->zAlia
7ab0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s;.            i
7ac0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7ad0: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
7ae0: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
7af0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7b00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
7b10: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
7b20: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
7b30: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
7b40: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
7b50: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
7b60: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
7b70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7b80: 20 20 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20       if( zDb!=0 
7b90: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7ba0: 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  p(db->aDb[iDb].z
7bb0: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
7bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
7bd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7be0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7bf0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7c00: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74       if( 0==(cnt
7c10: 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  Tab++) ){.      
7c20: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7c30: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
7c40: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  or;.          pE
7c50: 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  xpr->pSchema = p
7c60: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
7c70: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
7c80: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
7c90: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  }.        for(j=
7ca0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
7cb0: 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
7cc0: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; j++, pCol++){.
7cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7ce0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
7cf0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
7d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7d10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7d20: 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
7d30: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
7d40: 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70         IdList *p
7d50: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20  Using;.         
7d60: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7d70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7d80: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
7d90: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
7da0: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
7db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
7dc0: 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  xpr->pSchema = p
7dd0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
7de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
7df0: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
7e00: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
7e10: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
7e20: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
7e30: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7e40: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
7e50: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
7e60: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
7e70: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
7e80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
7e90: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
7ea0: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
7eb0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
7ec0: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7ee0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
7ef0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
7f00: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
7f10: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
7f20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7f30: 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73     if( i<pSrcLis
7f40: 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  t->nSrc-1 ){.   
7f50: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7f60: 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Item[1].jointype
7f70: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
7f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f90: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
7fa0: 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  h occurred in th
7fb0: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
7fc0: 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a  a natural join,.
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
7ff0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
8000: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
8010: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
8020: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
8030: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
8040: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
8050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8060: 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d   (pUsing = pItem
8070: 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29  [1].pUsing)!=0 )
8080: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8090: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
80a0: 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63  ch occurs on a c
80b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e  olumn that is in
80c0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
80d0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
80e0: 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20    ** of a join, 
80f0: 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20  skip the search 
8100: 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
8110: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20  le of the join. 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
8130: 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  * to avoid a dup
8140: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68 65  licate match the
8150: 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
8160: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
8180: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
8190: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
81b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
81c0: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
81d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
81e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
81f0: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8210: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
8220: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8240: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
82a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
82b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82c0: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a  T_TRIGGER.    /*
82d0: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
82e0: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
82f0: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20   the name, then 
8300: 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74  maybe .    ** it
8310: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
8320: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
8330: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
8340: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
8350: 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30  Db==0 && zTab!=0
8360: 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50   && cnt==0 && pP
8370: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21  arse->trigStack!
8380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67  =0 ){.      Trig
8390: 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67  gerStack *pTrigg
83a0: 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65  erStack = pParse
83b0: 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20  ->trigStack;.   
83c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
83d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
83e0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
83f0: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
8400: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
8410: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
8420: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
8430: 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65  iTable = pTrigge
8440: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a  rStack->newIdx;.
8450: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8460: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
8470: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70  Tab );.        p
8480: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
8490: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  ack->pTab;.     
84a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67   }else if( pTrig
84b0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
84c0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
84d0: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20  3StrICmp("old", 
84e0: 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zTab)==0 ){.    
84f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8500: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
8510: 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20  k->oldIdx;.     
8520: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
8530: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
8540: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
8550: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8560: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pTab;.      }.. 
8570: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
8580: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
8590: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ol;.        Colu
85a0: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *pCol = pTab-
85b0: 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  >aCol;..        
85c0: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
85d0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
85e0: 20 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b          cntTab++
85f0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
8600: 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61  ol=0; iCol < pTa
8610: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c  b->nCol; iCol++,
8620: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
8630: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8640: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
8650: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
8660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
8670: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
8680: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8690: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
86a0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
86b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
86c0: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70  Column = iCol==p
86d0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
86e0: 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  : iCol;.        
86f0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
8700: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
8710: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b  [iCol].affinity;
8720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8730: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
8740: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d   EP_ExpCollate)=
8750: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8760: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
8770: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
8780: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
8790: 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b  ), zColl,-1, 0);
87a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
87b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
87c0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
87d0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
87e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
87f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8800: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
8810: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8820: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
8830: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
8840: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
8850: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
8860: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
8870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
8880: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
8890: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
88a0: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
88b0: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
88c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
88d0: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
88e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
88f0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
8900: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
8910: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
8920: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
8930: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
8940: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
8950: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
8960: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
8970: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
8980: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
8990: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
89a0: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
89b0: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
89c0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
89d0: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
89e0: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
89f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
8a00: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
8a10: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
8a20: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
8a30: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
8a40: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
8a50: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
8a60: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
8a70: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
8a80: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
8a90: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
8aa0: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
8ab0: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
8ac0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
8ad0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
8ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
8af0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
8b00: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
8b10: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
8b20: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
8b30: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
8b40: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
8b50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8b60: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
8b70: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
8b80: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
8b90: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
8ba0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
8bb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8bc0: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
8bd0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
8be0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
8bf0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
8c00: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
8c10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8c20: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
8c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
8c40: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
8c50: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
8c60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
8c70: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
8c80: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
8c90: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
8ca0: 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  r->pSelect==0 );
8cb0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
8cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8cd0: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  (pEList->a[j].pE
8ce0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
8cf0: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
8d00: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
8d10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8d20: 70 44 75 70 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45  pDup->pColl = pE
8d30: 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
8d40: 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 66 6c          pDup->fl
8d50: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
8d60: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  late;.          
8d70: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
8d80: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
8d90: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
8da0: 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e  ar*)pExpr->span.
8db0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  z);.          if
8dc0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64  ( pExpr->token.d
8dd0: 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  yn ) sqliteFree(
8de0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
8df0: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  ken.z);.        
8e00: 20 20 6d 65 6d 63 70 79 28 70 45 78 70 72 2c 20    memcpy(pExpr, 
8e10: 70 44 75 70 2c 20 73 69 7a 65 6f 66 28 2a 70 45  pDup, sizeof(*pE
8e20: 78 70 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  xpr));.         
8e30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 75 70   sqliteFree(pDup
8e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  );.          cnt
8e50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
8e60: 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  pMatch = 0;.    
8e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
8e80: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
8e90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
8ea0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
8eb0: 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _2;.        }.  
8ec0: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
8ed0: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
8ee0: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
8ef0: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
8f00: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
8f10: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
8f20: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
8f30: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
8f40: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
8f50: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
8f60: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
8f70: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
8f80: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
8f90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
8fa0: 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20   If X and Y are 
8fb0: 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77  NULL (in other w
8fc0: 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65  ords if only the
8fd0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69   column name Z i
8fe0: 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29  s.  ** supplied)
8ff0: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
9000: 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  f Z is enclosed 
9010: 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  in double-quotes
9020: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73  , then.  ** Z is
9030: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
9040: 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  l if it doesn't 
9050: 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e  match any column
9060: 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74   names.  In that
9070: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e  .  ** case, we n
9080: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69  eed to return ri
9090: 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74  ght away and not
90a0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
90b0: 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e  s to.  ** pExpr.
90c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75  .  **.  ** Becau
90d0: 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  se no reference 
90e0: 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65  was made to oute
90f0: 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20  r contexts, the 
9100: 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66  pNC->nRef.  ** f
9110: 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68  ields are not ch
9120: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e  anged in any con
9130: 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  text..  */.  if(
9140: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
9150: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
9160: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
9170: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9180: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
9190: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
91a0: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
91b0: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
91c0: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
91d0: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
91e0: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
91f0: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
9200: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
9210: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
9220: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
9230: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
9240: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
9250: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
9260: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
9270: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
9280: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
9290: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
92a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
92b0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
92c0: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
92d0: 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a  .", zCol, (char*
92e0: 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )0);.    }else i
92f0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
9300: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
9310: 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c  g(&z, zTab, ".",
9320: 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29   zCol, (char*)0)
9330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9340: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72     z = sqliteStr
9350: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
9360: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9370: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72  rMsg(pParse, zEr
9380: 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, z);.    sqlit
9390: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54  eFree(z);.    pT
93a0: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
93b0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
93c0: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
93d0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
93e0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
93f0: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
9400: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
9410: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
9420: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
9430: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
9440: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
9450: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
9460: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
9470: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
9480: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
9490: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
94a0: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
94b0: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
94c0: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
94d0: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
94e0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
94f0: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
9500: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
9510: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
9520: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
9530: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
9540: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
9550: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
9560: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
9570: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
9580: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
9590: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
95a0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
95b0: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
95c0: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
95d0: 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c  sk)1)<<n;.  }..l
95e0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
95f0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
9600: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
9610: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
9620: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
9630: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
9640: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
9650: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
9660: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
9670: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
9680: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9690: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
96a0: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
96b0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
96c0: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
96d0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
96e0: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
96f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9700: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
9710: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
9720: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d  rse, pExpr, pNC-
9730: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
9740: 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70  if( pMatch && !p
9750: 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29  Match->pSelect )
9760: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
9770: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
9780: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ab;.    }.    /*
9790: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
97a0: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
97b0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
97c0: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
97d0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
97e0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
97f0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
9800: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
9810: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
9820: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
9830: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
9840: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
9850: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
9860: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
9870: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
9880: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
9890: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
98a0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
98b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
98c0: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
98d0: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
98e0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
98f0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
9900: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
9910: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
9920: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
9930: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
9940: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
9950: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
9960: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
9970: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
9980: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
9990: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
99a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
99b0: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
99c0: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
99d0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
99e0: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
99f0: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
9a00: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
9a10: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
9a20: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
9a30: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
9a40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
9a50: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
9a60: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
9a70: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
9a80: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
9a90: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
9aa0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
9ab0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
9ac0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
9ad0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
9ae0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
9af0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  >pParse;..  if( 
9b00: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
9b10: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
9b20: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
9b30: 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  1;.  ExprSetProp
9b40: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
9b50: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
9b60: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
9b70: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
9b80: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
9b90: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
9ba0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
9bb0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
9bc0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
9bd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
9be0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
9bf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
9c00: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
9c10: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
9c20: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
9c30: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
9c40: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
9c50: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
9c60: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9c70: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
9c80: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
9c90: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
9ca0: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
9cb0: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
9cc0: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
9cd0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
9ce0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
9cf0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
9d00: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
9d10: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
9d20: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
9d30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
9d40: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
9d50: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
9d60: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
9d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
9d80: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
9d90: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
9da0: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
9db0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
9dc0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
9dd0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
9de0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
9df0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
9e00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
9e10: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
9e20: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
9e30: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
9e40: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
9e50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9e60: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
9e70: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
9e80: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
9e90: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
9ea0: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
9eb0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
9ec0: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
9ed0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
9ee0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
9ef0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
9f00: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
9f10: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
9f20: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
9f30: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
9f40: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
9f50: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
9f60: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
9f70: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
9f80: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
9f90: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
9fa0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
9fb0: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
9fc0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
9fd0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
9fe0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
9ff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a000: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
a010: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
a020: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
a030: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
a040: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a050: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
a060: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a070: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
a080: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
a090: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
a0a0: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
a0b0: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
a0c0: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
a0d0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
a0e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a0f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
a100: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
a110: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
a120: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
a130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
a140: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
a150: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
a160: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
a170: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
a180: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
a190: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
a1a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
a1b0: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
a1c0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
a1d0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
a1e0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
a1f0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
a200: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
a210: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
a220: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
a230: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
a240: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
a250: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
a260: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
a270: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a280: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
a290: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
a2a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
a2b0: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  t i;.      int a
a2c0: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
a2d0: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72         /* Author
a2e0: 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74  ization to use t
a2f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
a300: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
a330: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
a340: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
a350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a360: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
a370: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
a380: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
a390: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
a3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
a3b0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a3c0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
a3d0: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45       int enc = E
a3e0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
a3f0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
a400: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
a410: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
a420: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
a430: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
a440: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
a450: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
a460: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
a470: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
a480: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
a490: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
a4a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
a4b0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
a4c0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
a4d0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
a4e0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
a4f0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
a500: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
a510: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
a520: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a530: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
a540: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
a550: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a560: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
a570: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
a580: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
a590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a5a0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
a5b0: 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20     if( pDef ){. 
a5c0: 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71         auth = sq
a5d0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
a5e0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55  Parse, SQLITE_FU
a5f0: 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d  NCTION, 0, pDef-
a600: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
a610: 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51      if( auth!=SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a630: 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53       if( auth==S
a640: 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20  QLITE_DENY ){.  
a650: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a660: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a670: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
a680: 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  d to use functio
a690: 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  n: %s",.        
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
a6c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a6d0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a6e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
a6f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a700: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
a710: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
a740: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
a750: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
a760: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a770: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a780: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
a790: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
a7a0: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
a7b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
a7c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
a7d0: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
a7e0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
a7f0: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
a800: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a810: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a820: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
a830: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
a840: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
a850: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
a860: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
a870: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
a880: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a890: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
a8a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a8b0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
a8c0: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
a8d0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
a8e0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
a8f0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
a900: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
a910: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
a920: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
a930: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
a940: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
a950: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a960: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
a970: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
a980: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
a990: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
a9a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
a9b0: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
a9c0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
a9d0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
a9e0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
a9f0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
aa00: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
aa10: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
aa20: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
aa30: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
aa40: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
aa50: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
aa60: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
aa70: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
aa80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
aa90: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
aaa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aab0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
aac0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
aad0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
aae0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
aaf0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
ab00: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
ab10: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
ab20: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
ab30: 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Ref;.#ifndef SQL
ab40: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
ab50: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
ab60: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
ab70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ab80: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62  rMsg(pParse,"sub
ab90: 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74  queries prohibit
aba0: 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73  ed in CHECK cons
abb0: 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20  traints");.     
abc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
abd0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
abe0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
abf0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
ac00: 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61   pNC);.        a
ac10: 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66  ssert( pNC->nRef
ac20: 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20  >=nRef );.      
ac30: 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d    if( nRef!=pNC-
ac40: 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20  >nRef ){.       
ac50: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
ac60: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
ac70: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
ac80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ac90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
aca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
acb0: 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65  T_CHECK.    case
acc0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
acd0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
ace0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
acf0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ad00: 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65  g(pParse,"parame
ad10: 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20  ters prohibited 
ad20: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
ad30: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ints");.      }.
ad40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
ad60: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ad70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ad80: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
ad90: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
ada0: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
adb0: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
adc0: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
add0: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
ade0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
adf0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
ae00: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
ae10: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
ae20: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
ae30: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
ae40: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
ae50: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
ae60: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
ae70: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
ae80: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
ae90: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
aea0: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
aeb0: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
aec0: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
aed0: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
aee0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
aef0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
af00: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
af10: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
af20: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
af30: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
af40: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
af50: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
af60: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
af70: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
af80: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
af90: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
afa0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
afb0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
afc0: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
afd0: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
afe0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
aff0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
b000: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
b010: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
b020: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
b030: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
b040: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
b050: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
b060: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
b070: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
b080: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
b090: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
b0a0: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
b0b0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
b0c0: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
b0d0: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
b0e0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
b0f0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
b100: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
b110: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
b120: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
b130: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
b140: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
b150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
b160: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
b170: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
b180: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
b190: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
b1a0: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
b1b0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
b1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
b1d0: 6c 76 65 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d  lveNames( .  Nam
b1e0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
b1f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
b200: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
b210: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
b220: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
b230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b240: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
b250: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
b260: 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73  {.  int savedHas
b270: 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Agg;.  if( pExpr
b280: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b290: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
b2a0: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 69 66  XPR_DEPTH>0.  if
b2b0: 28 20 28 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  ( (pExpr->nHeigh
b2c0: 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  t+pNC->pParse->n
b2d0: 48 65 69 67 68 74 29 3e 53 51 4c 49 54 45 5f 4d  Height)>SQLITE_M
b2e0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 7b  AX_EXPR_DEPTH ){
b2f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
b300: 72 4d 73 67 28 70 4e 43 2d 3e 70 50 61 72 73 65  rMsg(pNC->pParse
b310: 2c 20 0a 20 20 20 20 20 20 20 22 45 78 70 72 65  , .       "Expre
b320: 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f  ssion tree is to
b330: 6f 20 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d  o large (maximum
b340: 20 64 65 70 74 68 20 25 64 29 22 2c 0a 20 20 20   depth %d)",.   
b350: 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45      SQLITE_MAX_E
b360: 58 50 52 5f 44 45 50 54 48 0a 20 20 20 20 29 3b  XPR_DEPTH.    );
b370: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
b380: 20 7d 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65   }.  pNC->pParse
b390: 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78  ->nHeight += pEx
b3a0: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
b3b0: 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41 67  dif.  savedHasAg
b3c0: 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67 3b  g = pNC->hasAgg;
b3d0: 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d  .  pNC->hasAgg =
b3e0: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
b3f0: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
b400: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
b410: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
b420: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
b430: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65  pNC->pParse->nHe
b440: 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e  ight -= pExpr->n
b450: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
b460: 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30   if( pNC->nErr>0
b470: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
b480: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b490: 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20  P_Error);.  }.  
b4a0: 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20  if( pNC->hasAgg 
b4b0: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
b4c0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
b4d0: 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _Agg);.  }else i
b4e0: 66 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29  f( savedHasAgg )
b4f0: 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67  {.    pNC->hasAg
b500: 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  g = 1;.  }.  ret
b510: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
b520: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
b530: 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ror);.}../*.** A
b540: 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63   pointer instanc
b550: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
b560: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70  ure is used to p
b570: 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ass information.
b580: 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45  ** through walkE
b590: 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64  xprTree into cod
b5a0: 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e  eSubqueryStep().
b5b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
b5c0: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75  ct QueryCoder Qu
b5d0: 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74  eryCoder;.struct
b5e0: 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20   QueryCoder {.  
b5f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
b600: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b610: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b620: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
b630: 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61  C;    /* Namespa
b640: 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c  ce of first encl
b650: 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d  osing query */.}
b660: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ;.../*.** Genera
b670: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c  te code for scal
b680: 61 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73  ar subqueries us
b690: 65 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73  ed as an express
b6a0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70  ion.** and IN op
b6b0: 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c  erators.  Exampl
b6c0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53  es:.**.**     (S
b6d0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
b6e0: 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71           -- subq
b6f0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53  uery.**     EXIS
b700: 54 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  TS (SELECT a FRO
b710: 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53  M b)   -- EXISTS
b720: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
b730: 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20   x IN (4,5,11)  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49              -- I
b750: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
b760: 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61  list on right-ha
b770: 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78  nd side.**     x
b780: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
b790: 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20  OM b)     -- IN 
b7a0: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75  operator with su
b7b0: 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69  bquery on the ri
b7c0: 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45  ght.**.** The pE
b7d0: 78 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  xpr parameter de
b7e0: 73 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72  scribes the expr
b7f0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
b800: 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f  ains the IN.** o
b810: 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75  perator or subqu
b820: 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ery..*/.#ifndef 
b830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b840: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
b850: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
b860: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b870: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
b880: 74 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20  t testAddr = 0; 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d        /* One-tim
b8b0: 65 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a  e test address *
b8c0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  /.  Vdbe *v = sq
b8d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b8e0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
b8f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a 20 20 2f   ) return;...  /
b900: 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74  * This code must
b910: 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65   be run in its e
b920: 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74 69  ntirety every ti
b930: 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
b940: 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79  ered.  ** if any
b950: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b960: 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a  g is true:.  **.
b970: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
b980: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
b990: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
b9a0: 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20  ubquery.  **    
b9b0: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
b9c0: 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78 70  d side is an exp
b9d0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
b9e0: 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65  taining variable
b9f0: 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20  s.  **    *  We 
ba00: 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72 69  are inside a tri
ba10: 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gger.  **.  ** I
ba20: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
ba30: 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68  ve are false, th
ba40: 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68  en we can run th
ba50: 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63  is code just onc
ba60: 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20  e.  ** save the 
ba70: 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75  results, and reu
ba80: 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  se the same resu
ba90: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
baa0: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20   invocations..  
bab0: 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  */.  if( !ExprHa
bac0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
bad0: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
bae0: 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72  ) && !pParse->tr
baf0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69  igStack ){.    i
bb00: 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d  nt mem = pParse-
bb10: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
bb20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bb30: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d   OP_MemLoad, mem
bb40: 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41 64  , 0);.    testAd
bb50: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
bb60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
bb70: 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  0, 0);.    asser
bb80: 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c  t( testAddr>0 ||
bb90: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
bba0: 69 6c 65 64 28 29 20 29 3b 0a 20 20 20 20 73 71  iled() );.    sq
bbb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bbc0: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
bbd0: 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  mem);.  }..  swi
bbe0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
bbf0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
bc00: 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61  : {.      char a
bc10: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b  ffinity;.      K
bc20: 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a  eyInfo keyInfo;.
bc30: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
bc40: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
bc50: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
bc60: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
bc70: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
bc80: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
bc90: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
bca0: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
bcb0: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
bcc0: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
bcd0: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
bce0: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
bcf0: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
bd00: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
bd10: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
bd20: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
bd30: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
bd40: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
bd50: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
bd60: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
bd70: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
bd80: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
bd90: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
bda0: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
bdb0: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
bdc0: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
bdd0: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
bde0: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
bdf0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
be00: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
be10: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
be20: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
be30: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
be40: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
be50: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
be60: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
be70: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
be80: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
be90: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
bea0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
beb0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
bec0: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
bed0: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
bee0: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
bef0: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
bf00: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
bf10: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
bf20: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
bf30: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
bf40: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
bf50: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
bf60: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
bf70: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
bf80: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
bf90: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
bfa0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bfb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bfc0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
bfd0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
bfe0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
bff0: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
c000: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
c010: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
c020: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
c030: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c040: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
c050: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
c060: 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  1);..      if( p
c070: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
c080: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
c090: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
c0a0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
c0b0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
c0c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
c0d0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
c0e0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
c0f0: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
c100: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
c110: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
c120: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
c130: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
c140: 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d         int iParm
c150: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
c160: 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e   +  (((int)affin
c170: 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20  ity)<<16);.     
c180: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
c190: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ist;.        ass
c1a0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
c1b0: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
c1c0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
c1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
c1e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c1f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
c200: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
c210: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  rm, 0, 0, 0, 0) 
c220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
c230: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
c240: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
c250: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
c260: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
c270: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
c280: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
c290: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
c2a0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  nfo.aColl[0] = s
c2b0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
c2c0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
c2d0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
c2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
c2f0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c300: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
c310: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
c320: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
c330: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
c340: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
c350: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
c360: 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20  **..** For each 
c370: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
c380: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
c390: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
c3a0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
c3b0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
c3c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
c3d0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
c3e0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
c3f0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
c400: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
c410: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
c420: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
c430: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
c440: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
c450: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
c460: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
c470: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
c480: 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
c490: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
c4a0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
c4b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c4c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c4d0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ..        if( !a
c4e0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
c4f0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
c500: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
c510: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c520: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
c530: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  [0] = pExpr->pLe
c540: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  ft->pColl;..    
c550: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
c560: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
c570: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
c580: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  >. */.        fo
c590: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
c5a0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
c5b0: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
c5c0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
c5d0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
c5e0: 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
c5f0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
c600: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
c610: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
c620: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
c630: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
c640: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
c650: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
c660: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
c670: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
c680: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
c690: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
c6a0: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
c6b0: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
c6c0: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
c6d0: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
c6e0: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
c6f0: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
c700: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c710: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 30    if( testAddr>0
c720: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
c730: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
c740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
c750: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c760: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
c770: 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20  dr-1, 3);.      
c780: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
c790: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
c7b0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
c7c0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
c7d0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
c7e0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
c7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c800: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
c810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c820: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
c830: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
c840: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
c850: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
c860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c870: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
c880: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
c890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c8a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c8b0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
c8c0: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
c8d0: 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
c8e0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  NFO);.      brea
c8f0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
c900: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
c910: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
c920: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
c930: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
c940: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
c950: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
c960: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
c970: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
c980: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
c990: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
c9a0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
c9b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
c9c0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
c9d0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
c9e0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
c9f0: 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75  Token one = { (u
ca00: 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a  8*)"1", 0, 1 };.
ca10: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
ca20: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d  el;.      int iM
ca30: 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f  em;.      int so
ca40: 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d  p;..      pExpr-
ca50: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20  >iColumn = iMem 
ca60: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
ca70: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
ca80: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
ca90: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
caa0: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
cab0: 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53  .        sop = S
cac0: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
cad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cae0: 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
caf0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
cb00: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cb10: 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75 65  , "# Init subque
cb20: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
cb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb40: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69     sop = SRT_Exi
cb50: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
cb60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cb70: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
cb80: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Mem);.        Vd
cb90: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
cba0: 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73   Init EXISTS res
cbb0: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
cbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cbd0: 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c  rDelete(pSel->pL
cbe0: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
cbf0: 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
cc00: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47  te3Expr(TK_INTEG
cc10: 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b  ER, 0, 0, &one);
cc20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cc30: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
cc40: 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d   pSel, sop, iMem
cc50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b  , 0, 0, 0, 0) ){
cc60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
cc70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cc80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
cc90: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
cca0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ccb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
ccc0: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  stAddr);.  }..  
ccd0: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
cce0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ccf0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
cd00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
cd10: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
cd20: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
cd30: 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
cd40: 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
cd50: 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  1] on the stack.
cd60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd70: 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65  codeInteger(Vdbe
cd80: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
cd90: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61 73  *z, int n){.  as
cda0: 73 65 72 74 28 20 7a 20 7c 7c 20 73 71 6c 69 74  sert( z || sqlit
cdb0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
cdc0: 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20   );.  if( z ){. 
cdd0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
cde0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
cdf0: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
ce00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
ce20: 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , i, 0);.    }el
ce30: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  se if( sqlite3Fi
ce40: 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b  tsIn64Bits(z) ){
ce50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ce60: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36  beOp3(v, OP_Int6
ce70: 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  4, 0, 0, z, n);.
ce80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce90: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
cea0: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
ceb0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , z, n);.    }. 
cec0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
ced0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
cee0: 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
cef0: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
cf00: 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
cf10: 20 70 54 61 62 20 61 6e 64 20 70 75 73 68 20 74   pTab and push t
cf20: 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  hat column value
cf30: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
cf40: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 6f  There.** is an o
cf50: 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54  pen cursor to pT
cf60: 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20 20 49  ab in iTable.  I
cf70: 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
cf80: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
cf90: 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
cfa0: 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
cfb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cfc0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
cfd0: 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a  Vdbe *v, Table *
cfe0: 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 75 6d  pTab, int iColum
cff0: 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  n, int iTable){.
d000: 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20    if( iColumn<0 
d010: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
d020: 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75  (pTab && IsVirtu
d030: 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56  al(pTab)) ? OP_V
d040: 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64  Rowid : OP_Rowid
d050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d060: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54  eAddOp(v, op, iT
d070: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  able, 0);.  }els
d080: 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b  e if( pTab==0 ){
d090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d0a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
d0b0: 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  mn, iTable, iCol
d0c0: 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  umn);.  }else{. 
d0d0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69     int op = IsVi
d0e0: 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50  rtual(pTab) ? OP
d0f0: 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f  _VColumn : OP_Co
d100: 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  lumn;.    sqlite
d110: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
d120: 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
d130: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  n);.    sqlite3C
d140: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
d150: 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  pTab, iColumn);.
d160: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d170: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
d180: 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  NT.    if( pTab-
d190: 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61  >aCol[iColumn].a
d1a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d1b0: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
d1c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d1d0: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66  Op(v, OP_RealAff
d1e0: 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20  inity, 0, 0);.  
d1f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
d200: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d210: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
d220: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
d230: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
d240: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
d250: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
d260: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
d270: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  of stack..**.** 
d280: 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
d290: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
d2a0: 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
d2b0: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
d2c0: 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
d2d0: 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
d2e0: 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
d2f0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
d300: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d310: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
d320: 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
d330: 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
d340: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
d350: 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
d360: 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
d370: 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
d380: 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
d390: 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
d3a0: 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
d3b0: 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
d3c0: 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
d3d0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
d3e0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
d3f0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
d400: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
d410: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d420: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
d430: 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63  t op;.  int stac
d440: 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a  kChng = 1;    /*
d450: 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67   Amount of chang
d460: 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68  e to stack depth
d470: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
d480: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d490: 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
d4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4b0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d4c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  0);.    return;.
d4d0: 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72    }.  op = pExpr
d4e0: 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
d4f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d500: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
d510: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
d520: 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
d530: 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
d540: 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
d550: 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
d560: 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
d570: 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
d580: 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
d590: 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
d5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
d5c0: 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c  oad, pCol->iMem,
d5d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
d5e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ak;.      }else 
d5f0: 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73  if( pAggInfo->us
d600: 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20  eSortingIdx ){. 
d610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d620: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d630: 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
d640: 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20  sortingIdx,.    
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
d670: 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a  iSorterColumn);.
d680: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
d6a0: 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
d6b0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
d6c0: 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a  _COLUMN case */.
d6d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d6e0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
d6f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
d700: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
d710: 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
d720: 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
d730: 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
d740: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
d750: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
d760: 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20  kOffset>0 );.   
d770: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d780: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
d790: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
d7a0: 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t-pExpr->iColumn
d7b0: 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  -1, 1);.      }e
d7c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d7d0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
d7e0: 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e  olumn(v, pExpr->
d7f0: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pTab, pExpr->iCo
d800: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
d810: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
d820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d830: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
d840: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
d850: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
d860: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
d870: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
d880: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d8a0: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
d8b0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
d8c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d8d0: 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c  K_FLOAT==OP_Real
d8e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d8f0: 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f  ( TK_STRING==OP_
d900: 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20  String8 );.     
d910: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
d920: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
d930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d940: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63  (v, op, 0, 0, (c
d950: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
d960: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
d970: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
d980: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d990: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
d9a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9b0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
d9c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
d9d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d9e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
d9f0: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
da00: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
da10: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
da20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
da30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
da40: 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c  K_BLOB==OP_HexBl
da50: 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ob );.      n = 
da60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
da70: 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   3;.      z = (c
da80: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
da90: 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61  n.z + 2;.      a
daa0: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
dab0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
dac0: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b  .        z = "";
dad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
dae0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
daf0: 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29   op, 0, 0, z, n)
db00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
db10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
db20: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
db30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
db40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
db50: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
db60: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
db70: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
db80: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
db90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dba0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
dbb0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
dbc0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
dbd0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  en.n);.      }. 
dbe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dbf0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
dc00: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
dc10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc20: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
dc30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
dc40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dc50: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dc60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
dc70: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
dc80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
dc90: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
dca0: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
dcb0: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
dcc0: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f       int aff, to
dcd0: 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _op;.      sqlit
dce0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
dcf0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
dd00: 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71  ;.      aff = sq
dd10: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
dd20: 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29  e(&pExpr->token)
dd30: 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20  ;.      to_op = 
dd40: 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  aff - SQLITE_AFF
dd50: 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78  _TEXT + OP_ToTex
dd60: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
dd70: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78   to_op==OP_ToTex
dd80: 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  t    || aff!=SQL
dd90: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
dda0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ddb0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f   to_op==OP_ToBlo
ddc0: 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  b    || aff!=SQL
ddd0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
dde0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ddf0: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d   to_op==OP_ToNum
de00: 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c  eric || aff!=SQL
de10: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
de20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
de30: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74   to_op==OP_ToInt
de40: 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c       || aff!=SQL
de50: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
de60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
de70: 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61   to_op==OP_ToRea
de80: 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c  l    || aff!=SQL
de90: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
dea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
deb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f  VdbeAddOp(v, to_
dec0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
ded0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
dee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
def0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
df00: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
df10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
df20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
df30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
df40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
df50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
df60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
df70: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
df80: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
df90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dfa0: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
dfb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dfc0: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
dfd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
dfe0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
dff0: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
e000: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
e010: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
e020: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
e030: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e040: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e050: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e060: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e070: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
e080: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
e090: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
e0a0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
e0b0: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
e0c0: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
e0d0: 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  hng = -1;.      
e0e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e0f0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
e100: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
e110: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
e120: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
e130: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
e140: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
e150: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
e160: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
e170: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
e180: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
e190: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
e1a0: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
e1b0: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
e1c0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
e1d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e1e0: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
e1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e200: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
e210: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
e220: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
e230: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
e240: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
e250: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
e260: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
e270: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
e280: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
e290: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
e2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e2b0: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
e2c0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
e2d0: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
e2e0: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
e2f0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
e300: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
e310: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e320: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
e330: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
e340: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
e350: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
e360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e370: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e380: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e3a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e3b0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
e3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e3d0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
e3e0: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
e3f0: 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  ng = -1;.      b
e400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e410: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
e420: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
e430: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
e440: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
e450: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
e460: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
e470: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
e480: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
e490: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
e4a0: 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e  en *p = &pLeft->
e4b0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63  token;.        c
e4c0: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
e4d0: 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73 22 2c  MPrintf("-%.*s",
e4e0: 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20   p->n, p->z);.  
e4f0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
e500: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
e510: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e520: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
e530: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70  Real, 0, 0, z, p
e540: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
e550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e560: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
e570: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
e580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e590: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
e5a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e5b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
e5c0: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
e5d0: 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
e5e0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
e5f0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
e600: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
e610: 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
e620: 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
e630: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
e640: 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
e650: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e660: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e670: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
e680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e690: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
e6a0: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
e6b0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
e6c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e6d0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
e6e0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
e6f0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
e700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e710: 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
e720: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
e730: 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
e740: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
e750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e760: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
e770: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
e780: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e790: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e7a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64  >pLeft);.      d
e7b0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
e7c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
e7d0: 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 2;.      sqlit
e7e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
e7f0: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
e800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e810: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
e820: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
e830: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
e840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e850: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
e860: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
e870: 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
e880: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
e890: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
e8a0: 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
e8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e8c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
e8d0: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
e8e0: 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  : %T",.         
e8f0: 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29     &pExpr->span)
e900: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e920: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
e930: 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46  mLoad, pInfo->aF
e940: 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
e950: 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  .iMem, 0);.     
e960: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e970: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e980: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
e990: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
e9a0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
e9b0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
e9c0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
e9d0: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
e9e0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
e9f0: 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
ea00: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
ea10: 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
ea20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
ea30: 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  d;.      int con
ea40: 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  stMask = 0;.    
ea50: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
ea60: 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
ea70: 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 43  se->db);.      C
ea80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
ea90: 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  0;.      zId = (
eaa0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
eab0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
eac0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
ead0: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
eae0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
eaf0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
eb00: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
eb10: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
eb20: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
eb30: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
eb40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
eb50: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
eb60: 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20  pList);.#ifndef 
eb70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
eb80: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
eb90: 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
eba0: 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
ebb0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
ebc0: 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
ebd0: 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
ebe0: 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
ebf0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
ec00: 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
ec10: 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
ec20: 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
ec30: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
ec40: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
ec50: 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
ec60: 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
ec70: 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
ec80: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
ec90: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
eca0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
ecb0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
ecc0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
ecd0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
ece0: 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
ecf0: 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
ed00: 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
ed10: 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
ed20: 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
ed30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ed40: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
ed50: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
ed60: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
ed70: 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
ed80: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
ed90: 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
eda0: 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
edb0: 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
edc0: 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
edd0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
ede0: 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
edf0: 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
ee00: 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
ee10: 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
ee20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  */.      if( nEx
ee30: 70 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  pr>=2 && (pExpr-
ee40: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
ee50: 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
ee60: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
ee70: 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
ee80: 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70 72  tion(pDef, nExpr
ee90: 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  , pList->a[1].pE
eea0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
eeb0: 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b  e if( nExpr>0 ){
eec0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
eed0: 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
eee0: 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66  oadFunction(pDef
eef0: 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
ef00: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
ef10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
ef20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
ef30: 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
ef40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
ef50: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
ef60: 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
ef70: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
ef80: 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d      constMask |=
ef90: 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20   (1<<i);.       
efa0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
efb0: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
efc0: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
efd0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
efe0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
eff0: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  eq(pParse, pList
f000: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f010: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f020: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
f030: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
f040: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
f050: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61  ll ) pColl = pPa
f060: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
f070: 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
f080: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
f090: 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
f0a0: 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
f0b0: 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P3_COLLSEQ);.   
f0c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f0d0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
f0e0: 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d  Function, constM
f0f0: 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68 61  ask, nExpr, (cha
f100: 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43  r*)pDef, P3_FUNC
f110: 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63  DEF);.      stac
f120: 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b  kChng = 1-nExpr;
f130: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f140: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f150: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
f170: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
f180: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
f190: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
f1a0: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
f1b0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
f1c0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
f1d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
f1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f1f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
f200: 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  oad, pExpr->iCol
f210: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56  umn, 0);.      V
f220: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f230: 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20  # load subquery 
f240: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
f250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f260: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
f270: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
f280: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
f290: 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  ity;.      int c
f2a0: 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
f2b0: 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20  ->ckOffset;.    
f2c0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
f2d0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
f2e0: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
f2f0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
f300: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
f310: 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
f320: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
f330: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
f340: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
f350: 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
f360: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
f370: 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  suitable for.   
f380: 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d     ** P3 of OP_M
f390: 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20  akeRecord..     
f3a0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69   */.      affini
f3b0: 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
f3c0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
f3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f3e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f3f0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
f400: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66      pParse->ckOf
f410: 66 73 65 74 20 3d 20 28 63 6b 4f 66 66 73 65 74  fset = (ckOffset
f420: 20 3f 20 28 63 6b 4f 66 66 73 65 74 2b 31 29 20   ? (ckOffset+1) 
f430: 3a 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  : 0);..      /* 
f440: 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20  Code the <expr> 
f450: 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20  from "<expr> IN 
f460: 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70  (...)". The temp
f470: 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20  orary table.    
f480: 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62    ** pExpr->iTab
f490: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
f4a0: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65  values that make
f4b0: 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65   up the (...) se
f4c0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
f4d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f4e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f4f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
f500: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f510: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
f520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f530: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
f540: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b  tNull, -1, addr+
f550: 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  4);            /
f560: 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20  * addr + 0 */.  
f570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f580: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
f590: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 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 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
f5c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
f5e0: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
f5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f600: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
f610: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
f620: 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a  finity, 1);   /*
f630: 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
f640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f650: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
f660: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
f670: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
f680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f690: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
f6a0: 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  , 0);           
f6b0: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
f6c0: 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65   6 */..      bre
f6d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f6e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
f6f0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
f700: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
f710: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
f720: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f730: 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
f740: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a  Expr->pList->a;.
f750: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
f760: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
f770: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f780: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f790: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
f7a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f7b0: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
f7c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f7d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f7e0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
f7f0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
f800: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
f810: 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b  t, OP_Ge, 0, 0);
f820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
f840: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
f850: 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
f860: 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
f870: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
f880: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f890: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
f8a0: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
f8b0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
f8c0: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
f8d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
f8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f8f0: 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a   OP_And, 0, 0);.
f900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f910: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
f920: 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  PLUS: {.      sq
f930: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f940: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
f950: 66 74 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b  ft);.      stack
f960: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
f970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f980: 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
f990: 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f  .      int expr_
f9a0: 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20  end_label;.     
f9b0: 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20   int jumpInst;. 
f9c0: 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a       int nExpr;.
f9d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
f9e0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
f9f0: 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  ist;.      struc
fa00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
fa10: 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20  *aListelem;..   
fa20: 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d     assert(pExpr-
fa30: 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61  >pList);.      a
fa40: 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c  ssert((pExpr->pL
fa50: 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20  ist->nExpr % 2) 
fa60: 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  == 0);.      ass
fa70: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
fa80: 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
fa90: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
faa0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
fab0: 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
fac0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
fad0: 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
fae0: 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f  xpr;.      expr_
faf0: 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69  end_label = sqli
fb00: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
fb10: 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  (v);.      if( p
fb20: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
fb30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
fb40: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fb50: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
fb60: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
fb70: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d  i=0; i<nExpr; i=
fb80: 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
fb90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fba0: 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
fbb0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
fbc0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
fbd0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbf0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
fc00: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
fc10: 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d  mpInst = codeCom
fc20: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
fc30: 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74  pr->pLeft, aList
fc40: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20  elem[i].pExpr,. 
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  OP_Ne, 0, 1);.  
fc80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fc90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
fca0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
fcb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fcc0: 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73      jumpInst = s
fcd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fce0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20  v, OP_IfNot, 1, 
fcf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
fd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fd10: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
fd20: 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
fd30: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
fd40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fd50: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70   OP_Goto, 0, exp
fd60: 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
fd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd80: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d  eJumpHere(v, jum
fd90: 70 49 6e 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pInst);.      }.
fda0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
fdb0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
fdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fdd0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
fde0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
fdf0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
fe00: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
fe10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
fe20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
fe30: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65  Right);.      }e
fe40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
fe50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fe60: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
fe70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fe80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
fe90: 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65  eLabel(v, expr_e
fea0: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
feb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
fec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fed0: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61  T_TRIGGER.    ca
fee0: 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20  se TK_RAISE: {. 
fef0: 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
ff00: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
ff10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ff20: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d        "RAISE() m
ff50: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
ff60: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
ff70: 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74  -program");..ret
ff80: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
ff90: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
ffa0: 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65  olumn!=OE_Ignore
ffb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
ffc0: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
ffd0: 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  umn==OE_Rollback
ffe0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
fff0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
10000 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
10010 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
10020 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
10030 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b  mn == OE_Fail );
10040 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
10050 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78  3DequoteExpr(pEx
10060 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
10070 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10080 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
10090 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
100a0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
100d0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
100e0 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
100f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10100 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10110 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
10120 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
10130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10140 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
10150 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
10160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10170 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
10180 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
10190 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
101a0 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
101b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
101c0 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
101d0 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
101e0 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
101f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10200 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
10210 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
10220 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  kOffset ){.    p
10230 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
10240 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20  += stackChng;.  
10250 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
10260 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20  ->ckOffset );.  
10270 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
10280 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
10290 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
102a0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
102b0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
102c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
102d0 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
102e0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
102f0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
10300 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a  ExprCode()..**.*
10310 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
10320 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20  ight also cache 
10330 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d  the result and m
10340 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20  odify the pExpr 
10350 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  tree.** so that 
10360 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65  it will make use
10370 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72   of the cached r
10380 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
10390 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a  ent evaluations.
103a0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  ** rather than e
103b0 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c  valuate the whol
103c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
103d0 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70  in.  Trivial exp
103e0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
103f0 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20  not cached.  If 
10400 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10410 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65  s cached, its re
10420 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
10430 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c  n a .** memory l
10440 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ocation..*/.void
10450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10460 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
10470 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
10480 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
10490 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
104a0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
104b0 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
104c0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
104d0 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20  turn;.  addr1 = 
104e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
104f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c  ntAddr(v);.  sql
10500 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10510 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61  rse, pExpr);.  a
10520 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
10530 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10540 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
10550 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33  dr1+1 || sqlite3
10560 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
10570 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  r1)->opcode==OP_
10580 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
10590 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  iMem = pExpr->iT
105a0 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
105b0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
105c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
105d0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
105e0 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  , 0);.    pExpr-
105f0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
10600 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  R;.  }.}.#endif.
10610 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10620 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
10630 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
10640 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
10650 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
10660 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f  ession list onto
10670 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
10680 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10690 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
106a0 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
106b0 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stack..*/.int sq
106c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
106d0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
106e0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
106f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10700 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10710 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ist    /* The ex
10720 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
10730 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a   be coded */.){.
10740 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10750 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
10760 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
10770 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
10780 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
10790 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
107a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
107b0 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  i=n; i>0; i--, p
107c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
107d0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
107e0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
107f0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
10800 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
10810 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
10820 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
10830 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
10840 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
10850 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
10860 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
10870 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
10880 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
10890 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
108a0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
108b0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
108c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
108d0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
108e0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
108f0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
10900 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
10910 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
10920 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
10930 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
10940 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
10950 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
10960 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
10970 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
10980 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
10990 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
109a0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
109b0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
109c0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
109d0 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
109e0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
109f0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
10a00 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
10a10 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
10a20 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
10a30 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
10a40 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
10a50 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
10a60 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
10a70 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
10a80 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
10a90 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
10aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
10ab0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
10ac0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
10ad0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
10ae0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
10af0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10b00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
10b10 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
10b20 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
10b30 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
10b40 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
10b50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
10b60 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
10b70 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
10b80 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
10b90 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
10ba0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10bb0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
10bc0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10bd0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
10be0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
10bf0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10c00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
10c10 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
10c20 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
10c30 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10c50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
10c60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10c70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10c80 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
10c90 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
10ca0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10cb0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
10cc0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
10cd0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
10ce0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10cf0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
10d00 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10d20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
10d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10d40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10d50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10d60 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
10d70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10d80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10d90 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
10da0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
10db0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
10dc0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
10dd0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
10de0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
10df0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
10e00 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
10e10 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
10e20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10e30 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
10e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10e50 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
10e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10e70 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
10e80 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
10e90 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
10ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10eb0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10ec0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
10ed0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10ee0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
10ef0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
10f00 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
10f10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
10f20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
10f30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10f40 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
10f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10f60 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
10f70 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
10f80 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
10f90 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
10fa0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
10fb0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
10fc0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
10fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10fe0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10ff0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
11000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11010 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
11020 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
11030 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11040 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
11050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
11060 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
11070 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
11080 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
11090 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
110a0 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
110b0 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
110c0 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
110d0 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
110e0 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
110f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
11100 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
11110 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
11120 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
11130 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
11140 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
11150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11160 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11170 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
11180 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11190 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
111a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
111b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
111c0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
111d0 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
111e0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
111f0 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
11200 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
11210 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
11220 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
11230 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
11240 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11250 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
11260 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11270 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11280 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
11290 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
112a0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
112b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
112c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
112d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
112e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
112f0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
11300 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11310 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
11320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11330 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11350 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
11360 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
11370 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11380 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
11390 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
113a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
113b0 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
113c0 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
113d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
113e0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
113f0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
11400 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
11410 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
11420 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
11430 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
11440 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
11450 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
11460 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
11470 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
11480 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
11490 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
114a0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
114b0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
114c0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
114d0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
114e0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
114f0 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
11500 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
11510 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
11520 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11530 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
11540 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
11550 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
11560 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
11570 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11580 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11590 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b  op = 0;.  int ck
115a0 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
115b0 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  >ckOffset;.  if(
115c0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
115d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
115e0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
115f0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
11600 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
11610 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
11620 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
11630 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
11640 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
11650 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
11660 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
11670 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
11680 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
11690 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
116a0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
116b0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
116c0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
116d0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
116e0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
116f0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
11700 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
11710 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
11720 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
11730 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
11740 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
11750 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
11760 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
11770 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
11780 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
11790 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
117a0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
117b0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
117c0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
117d0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
117e0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
117f0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
11800 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
11810 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
11820 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
11830 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
11840 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
11850 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
11860 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
11870 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
11880 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
11890 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
118a0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
118b0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
118c0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
118d0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
118e0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
118f0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
11900 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
11910 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11920 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
11930 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
11940 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
11950 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
11960 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
11970 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
11980 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
11990 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
119a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
119b0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
119c0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
119d0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
119e0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
119f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
11a00 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
11a10 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
11a20 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
11a30 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
11a40 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
11a50 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11a60 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
11a70 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
11a80 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
11a90 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
11aa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
11ab0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
11ac0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
11ad0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11af0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11b00 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
11b10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
11b20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11b30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11b40 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
11b50 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
11b60 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11b80 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
11b90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
11ba0 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
11bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11bc0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11bd0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
11be0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
11bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11c10 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
11c20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11c30 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
11c40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11c50 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
11c60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
11c70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11c90 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
11ca0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
11cb0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
11cc0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
11cd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
11ce0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
11cf0 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
11d00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
11d10 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
11d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11d30 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11d40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
11d50 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11d60 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11d70 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
11d80 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
11d90 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
11da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11db0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
11dc0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
11dd0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
11de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
11df0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
11e00 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
11e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11e20 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
11e30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11e40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
11e50 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
11e60 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
11e70 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
11e80 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
11e90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
11ea0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
11eb0 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
11ec0 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
11ed0 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
11ee0 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
11ef0 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
11f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11f10 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
11f20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
11f30 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
11f40 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
11f50 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11f60 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
11f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11f80 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
11f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11fa0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
11fb0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
11fc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11fd0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
11fe0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
11ff0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12000 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63  Addr(v);.      c
12010 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
12020 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
12030 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c  , OP_Ge, addr+3,
12040 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
12050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12060 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
12070 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
12080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12090 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
120a0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67  est);.      pRig
120b0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
120c0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
120d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
120e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
120f0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
12100 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
12110 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
12120 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Gt, dest, jump
12130 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
12140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12150 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
12160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12170 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
12180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12190 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
121a0 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
121b0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
121c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
121d0 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
121e0 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a  t = ckOffset;.}.
121f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
12200 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
12210 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
12220 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
12230 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
12240 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
12250 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
12260 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
12270 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
12280 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
12290 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
122a0 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
122b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
122c0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
122d0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
122e0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
122f0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
12300 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
12310 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
12320 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
12330 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
12340 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
12350 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
12360 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
12370 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
12380 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
12390 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
123a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
123b0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
123c0 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
123d0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
123e0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
123f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
12400 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
12410 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
12420 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
12430 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
12440 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
12450 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
12460 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
12470 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
12480 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
12490 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
124a0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
124b0 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
124c0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
124d0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
124e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
124f0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
12500 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
12510 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
12520 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
12530 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
12540 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
12550 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
12560 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
12570 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
12580 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
12590 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
125a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
125b0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
125c0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
125d0 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
125e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
125f0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
12600 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
12610 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
12620 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
12630 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
12640 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
12650 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
12660 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
12670 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
12680 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
12690 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
126a0 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
126b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
126c0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
126d0 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
126e0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
126f0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
12700 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
12710 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
12720 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
12730 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
12740 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12750 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
12760 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
12770 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
12780 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
12790 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
127a0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
127b0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
127c0 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
127d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
127e0 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
127f0 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
12800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12810 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
12820 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
12830 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
12840 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
12850 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
12860 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
12870 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
12880 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
12890 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
128a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
128b0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
128c0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
128d0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
128e0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
128f0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
12900 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
12910 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
12920 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
12930 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
12940 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12950 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
12960 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  n(AggInfo *pInfo
12970 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
12980 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
12990 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
129a0 28 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  (.       pInfo->
129b0 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a  aCol,.       siz
129c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  eof(pInfo->aCol[
129d0 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
129e0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
129f0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 70  olumn,.       &p
12a00 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41 6c 6c  Info->nColumnAll
12a10 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  oc,.       &i.  
12a20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
12a30 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
12a40 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
12a50 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
12a60 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
12a70 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
12a80 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
12a90 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
12aa0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
12ab0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
12ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ad0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 41  addAggInfoFunc(A
12ae0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
12af0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
12b00 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->aFunc = sqlite
12b10 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
12b20 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
12b30 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
12b40 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
12b50 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20  0]),.       3,. 
12b60 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
12b70 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  unc,.       &pIn
12b80 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a  fo->nFuncAlloc,.
12b90 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20         &i.  );. 
12ba0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
12bb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
12bc0 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
12bd0 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  kExprTree() used
12be0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
12bf0 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  * sqlite3ExprAna
12c00 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
12c10 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
12c20 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
12c30 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
12c40 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12c50 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
12c60 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
12c70 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
12c80 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a  ction at pExpr..
12c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
12ca0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76  alyzeAggregate(v
12cb0 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
12cc0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
12cd0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
12ce0 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
12cf0 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61  ext *)pArg;.  Pa
12d00 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
12d10 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
12d20 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
12d30 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
12d40 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
12d50 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49  nfo = pNC->pAggI
12d60 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69 74 63  nfo;.  ..  switc
12d70 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
12d80 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
12d90 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
12da0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
12db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
12dc0 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d  see if the colum
12dd0 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  n is in one of t
12de0 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
12df0 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63   FROM.      ** c
12e00 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67  lause of the agg
12e10 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
12e20 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c 69        if( pSrcLi
12e30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  st ){.        st
12e40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12e50 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
12e60 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
12e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
12e80 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
12e90 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
12ea0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
12eb0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
12ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
12ed0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
12ee0 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->iCursor ){.   
12ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
12f00 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
12f10 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
12f20 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74  t pExpr refers t
12f30 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20  o a table.      
12f40 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
12f50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
12f60 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
12f70 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20  gate query.  .  
12f80 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
12f90 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65           ** Make
12fa0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
12fb0 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67  e column in pAgg
12fc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20  Info->aCol[] if 
12fd0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20  there.          
12fe0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65    ** is not an e
12ff0 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61  ntry there alrea
13000 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy..            
13010 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
13020 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
13030 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66    pCol = pAggInf
13040 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  o->aCol;.       
13050 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13060 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
13070 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  n; k++, pCol++){
13080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13090 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d  f( pCol->iTable=
130a0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26  =pExpr->iTable &
130b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
130c0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
130d0 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
130e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
130f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13100 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13120 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 70 41 67        if( k>=pAg
13130 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  gInfo->nColumn &
13140 26 20 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66  & (k = addAggInf
13150 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66 6f  oColumn(pAggInfo
13160 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))>=0 ){.       
13170 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
13180 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
13190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
131a0 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
131b0 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
131c0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
131d0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
131e0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
131f0 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
13200 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
13210 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
13220 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70    pCol->iMem = p
13230 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
13250 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
13260 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
13270 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
13280 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
13290 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
132a0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
132b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
132c0 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
132d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
132e0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
132f0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13320 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
13330 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
13340 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
13350 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
13360 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
13370 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
13380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13390 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
133a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
133d0 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
133e0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
133f0 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
13400 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
13410 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
13420 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13440 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
13450 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
13460 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13470 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
13480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
134a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
134b0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
134c0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
134d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
134e0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
134f0 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
13500 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
13510 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
13520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13530 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13540 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
13550 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
13560 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
13570 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
13580 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
13590 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
135a0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
135b0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
135c0 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
135d0 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
135e0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
135f0 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
13600 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
13610 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
13620 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
13630 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
13640 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13650 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
13660 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
13670 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
13680 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
13690 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
136a0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
136b0 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = k;.           
136c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
136d0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
136e0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
136f0 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
13700 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
13710 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
13720 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
13730 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13740 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13750 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
13760 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d       /* The pNC-
13770 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20  >nDepth==0 test 
13780 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65  causes aggregate
13790 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75   functions in su
137a0 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a  bqueries.      *
137b0 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20  * to be ignored 
137c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43  */.      if( pNC
137d0 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
137e0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
137f0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
13800 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
13810 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
13820 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
13830 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
13840 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
13850 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
13860 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
13870 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
13880 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
13890 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
138a0 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
138b0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
138c0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
138d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
138e0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
138f0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
13900 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
13910 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13920 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
13930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13940 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
13950 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
13960 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
13970 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
13980 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
13990 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
139a0 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
139b0 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
139c0 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
139d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
139e0 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
139f0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
13a00 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
13a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
13a20 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
13a30 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
13a40 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
13a50 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
13a60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
13a70 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
13a80 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
13a90 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
13aa0 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
13ab0 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
13ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ad0 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
13ae0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
13af0 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
13b10 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
13b20 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
13b30 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
13b40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13b50 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13b60 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
13b70 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
13b80 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
13b90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13ba0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
13bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
13bc0 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
13bd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
13be0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c00 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
13c10 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
13c20 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
13c30 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
13c40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13c50 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
13c60 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78  = i;.        pEx
13c70 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
13c80 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
13c90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13ca0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13cb0 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77  /* Recursively w
13cc0 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c  alk subqueries l
13cd0 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f  ooking for TK_CO
13ce0 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20  LUMN nodes that 
13cf0 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20  need.  ** to be 
13d00 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47  changed to TK_AG
13d10 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69  G_COLUMN.  But i
13d20 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20  ncrement nDepth 
13d30 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f  so that.  ** TK_
13d40 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
13d50 65 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  es in subqueries
13d60 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67   will be unchang
13d70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13d80 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
13d90 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
13da0 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65  ++;.    walkSele
13db0 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53  ctExpr(pExpr->pS
13dc0 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67  elect, analyzeAg
13dd0 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
13de0 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d     pNC->nDepth--
13df0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
13e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
13e10 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  ze the given exp
13e20 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20  ression looking 
13e30 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
13e40 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66  nctions and.** f
13e50 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  or variables tha
13e60 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64  t need to be add
13e70 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  ed to the pParse
13e80 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a  ->aAgg[] array..
13e90 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e  ** Make addition
13ea0 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  al entries to th
13eb0 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
13ec0 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73   array as necess
13ed0 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
13ee0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
13ef0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
13f00 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
13f10 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
13f20 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
13f30 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
13f40 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  es()..**.** If e
13f50 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20  rrors are seen, 
13f60 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
13f70 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73  essage in zErrMs
13f80 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  g and return.** 
13f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
13fa0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
13fb0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13fc0 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
13fd0 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
13fe0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
13ff0 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72  nErr = pNC->pPar
14000 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b  se->nErr;.  walk
14010 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
14020 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
14030 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e  , pNC);.  return
14040 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
14050 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  rr - nErr;.}../*
14060 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
14070 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14080 67 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72  gates() for ever
14090 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
140a0 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  an.** expression
140b0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74   list.  Return t
140c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
140d0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ors..**.** If an
140e0 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c   error is found,
140f0 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73   the analysis is
14100 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69   cut short..*/.i
14110 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
14120 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d  alyzeAggList(Nam
14130 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
14140 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
14150 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
14160 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
14170 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
14180 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
14190 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
141a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
141b0 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
141c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
141d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
141e0 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c       nErr += sql
141f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
14200 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
14210 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
14220 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14230 20 6e 45 72 72 3b 0a 7d 0a                        nErr;.}.