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

Artifact a304c22073fb120f9c788ed34393089623c272e2:


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 36 20 32 30 30 37 2f 30 38 2f 31 36 20  .306 2007/08/16 
0220: 31 31 3a 33 36 3a 31 35 20 64 61 6e 69 65 6c 6b  11:36:15 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 20  red..*/.CollSeq 
15e0: 2a 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 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
1a90: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1aa0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
1ab0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
1ac0: 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65  ng sure the node
1ad0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73   eventually gets
1ae0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20   freed..*/.Expr 
1af0: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
1b00: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
1b20: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
1b30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
1b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
1b50: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
1b60: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
1b70: 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1b80: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e  operand */.  con
1b90: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
1ba0: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1bb0: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45   token */.){.  E
1bc0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
1bd0: 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  w = sqlite3Mallo
1be0: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 45 78  cZero( sizeof(Ex
1bf0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
1c00: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
1c10: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
1c20: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
1c30: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
1c40: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
1c50: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
1c60: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
1c70: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
1c80: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
1c90: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
1ca0: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
1cb0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
1cc0: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
1cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1ce0: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
1cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d00: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
1d10: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
1d20: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
1d30: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
1d40: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
1d50: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
1d60: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
1d70: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
1d80: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
1d90: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
1da0: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
1db0: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
1dc0: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
1dd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1de0: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
1df0: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
1e00: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
1e10: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
1e20: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1e30: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
1e40: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1e50: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1e60: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
1e70: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
1e80: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1e90: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
1ea0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
1eb0: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
1ec0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
1ed0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
1ee0: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
1ef0: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
1f00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1f10: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
1f20: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
1f30: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
1f40: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
1f50: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
1f60: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
1f70: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
1f80: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
1f90: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
1fa0: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
1fb0: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
1fc0: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
1fd0: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
1fe0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ff0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2000: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2010: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2030: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
2040: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
2050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2060: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
2070: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
2080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
2090: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
20a0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
20b0: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
20c0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
20d0: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
20e0: 71 6c 69 74 65 33 45 78 70 72 28 6f 70 2c 20 70  qlite3Expr(op, p
20f0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54  Left, pRight, pT
2100: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e 65  oken);.  if( pNe
2110: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
2120: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c  te3ExprDelete(pL
2130: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
2140: 33 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67  3ExprDelete(pRig
2150: 68 74 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ht);.    pParse-
2160: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2170: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
2180: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
2190: 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** When doing a 
21a0: 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f  nested parse, yo
21b0: 75 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65  u can include te
21c0: 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  rms in an expres
21d0: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f  sion.** that loo
21e0: 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23  k like this:   #
21f0: 30 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65  0 #1 #2 ...  The
2200: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
2210: 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  o elements.** on
2220: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30   the stack.  "#0
2230: 22 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20  " means the top 
2240: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
2250: 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20   "#1" means the 
2260: 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65  next down on the
2270: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20   stack.  And so 
2280: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
2290: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
22a0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
22b0: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
22c0: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
22d0: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
22e0: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
22f0: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
2300: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
2310: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
2320: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
2330: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
2340: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
2350: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
2360: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
2370: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
2380: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
2390: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
23a0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
23b0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
23c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
23d0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
23e0: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
23f0: 74 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  th;.  if( pParse
2400: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
2410: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2420: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72  sg(pParse, "near
2430: 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20   \"%T\": syntax 
2440: 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b  error", pToken);
2450: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
2460: 74 65 33 45 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c  te3Expr(TK_NULL,
2470: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
2480: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2490: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rn 0;.  p = sqli
24a0: 74 65 33 45 78 70 72 28 54 4b 5f 52 45 47 49 53  te3Expr(TK_REGIS
24b0: 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65  TER, 0, 0, pToke
24c0: 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  n);.  if( p==0 )
24d0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  {.    pParse->db
24e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
24f0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
2500: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
2510: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64 65 70  led */.  }.  dep
2520: 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a  th = atoi((char*
2530: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
2540: 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70  .  p->iTable = p
2550: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
2560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2570: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65 70  p(v, OP_Dup, dep
2580: 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  th, 0);.  sqlite
2590: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
25a0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54  _MemStore, p->iT
25b0: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65 74 75  able, 1);.  retu
25c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  rn p;.}../*.** J
25d0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
25e0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
25f0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
2600: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
2610: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
2620: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
2630: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
2640: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
2650: 69 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69  ite3ExprAnd(sqli
2660: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
2670: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
2680: 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74  ht){.  if( pLeft
2690: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
26a0: 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73  n pRight;.  }els
26b0: 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20  e if( pRight==0 
26c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c  ){.    return pL
26d0: 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eft;.  }else{.  
26e0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
26f0: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
2700: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
2710: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
2720: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
2730: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
2740: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2750: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
2760: 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61  Set the Expr.spa
2770: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
2780: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
2790: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
27a0: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
27b0: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
27c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27d0: 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a  3ExprSpan(Expr *
27e0: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c  pExpr, Token *pL
27f0: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
2800: 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ht){.  assert( p
2810: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
2820: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
2830: 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e  ;.  if( pRight->
2840: 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b  z && pLeft->z ){
2850: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
2860: 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c  ft->dyn==0 || pL
2870: 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d  eft->z[pLeft->n]
2880: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
2890: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20  Left->dyn==0 && 
28a0: 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29  pRight->dyn==0 )
28b0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
28c0: 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a  pan.z = pLeft->z
28d0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  ;.      pExpr->s
28e0: 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e  pan.n = pRight->
28f0: 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d  n + (pRight->z -
2900: 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20   pLeft->z);.    
2910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
2920: 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  pr->span.z = 0;.
2930: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2940: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
2950: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
2960: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
2970: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
2980: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
2990: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
29a0: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
29b0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
29c0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
29d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
29e0: 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65 72  r *pNew;.  asser
29f0: 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70  t( pToken );.  p
2a00: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
2a10: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
2a20: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  ->db, sizeof(Exp
2a30: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
2a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2a50: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2a60: 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69  (pList); /* Avoi
2a70: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
2a80: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
2a90: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
2aa0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
2ab0: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
2ac0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
2ad0: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
2ae0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
2af0: 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74 6f 6b  0 );.  pNew->tok
2b00: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
2b10: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
2b20: 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c  w->token;..  sql
2b30: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2b40: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2b50: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
2b60: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
2b70: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
2b80: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2b90: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
2ba0: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
2bb0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
2bc0: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
2bd0: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
2be0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
2bf0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
2c00: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
2c10: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
2c20: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
2c30: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
2c40: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
2c50: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
2c60: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
2c70: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
2c80: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
2c90: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
2ca0: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
2cb0: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
2cc0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
2cd0: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
2ce0: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
2cf0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2d00: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
2d10: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
2d20: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
2d30: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
2d40: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
2d50: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
2d60: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
2d70: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
2d80: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
2d90: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
2da0: 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20   next sequenial 
2db0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2dc0: 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a  is.** assigned..
2dd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2de0: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
2df0: 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
2e00: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2e10: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b    Token *pToken;
2e20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2e30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2e40: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
2e50: 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20  eturn;.  pToken 
2e60: 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b  = &pExpr->token;
2e70: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2e80: 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  n->n>=1 );.  ass
2e90: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
2ea0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2eb0: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29  Token->z[0]!=0 )
2ec0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e  ;.  if( pToken->
2ed0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  n==1 ){.    /* W
2ee0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
2ef0: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
2f00: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
2f10: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2f20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2f30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
2f40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
2f50: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ken->z[0]=='?' )
2f60: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
2f70: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
2f80: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
2f90: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
2fa0: 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73  er and.    ** us
2fb0: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
2fc0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
2fd0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45     int i;.    pE
2fe0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20  xpr->iTable = i 
2ff0: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70  = atoi((char*)&p
3000: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
3010: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53    if( i<1 || i>S
3020: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
3030: 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20  LE_NUMBER ){.   
3040: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3050: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
3060: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
3070: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
3080: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
3090: 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41     SQLITE_MAX_VA
30a0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
30b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
30c0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
30d0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
30e0: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
30f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
3100: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
3110: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
3120: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
3130: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
3140: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
3150: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
3160: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
3170: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
3180: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
3190: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
31a0: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
31b0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
31c0: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
31d0: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
31e0: 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20  n = pToken->n;. 
31f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
3200: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
3210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
3220: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
3230: 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  (pE = pParse->ap
3240: 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20  VarExpr[i])!=0. 
3250: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
3260: 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20  token.n==n.     
3270: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
3280: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b  E->token.z, pTok
3290: 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  en->z, n)==0 ){.
32a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
32b0: 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62  Table = pE->iTab
32c0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  le;.        brea
32d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
32e0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72  .    if( i>=pPar
32f0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a  se->nVarExpr ){.
3300: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3310: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
3320: 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20  nVar;.      if( 
3330: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
3340: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
3350: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
3360: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
3370: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
3380: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
3390: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
33a0: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
33b0: 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
33c0: 20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c    sqlite3DbReall
33d0: 6f 63 4f 72 46 72 65 65 28 0a 20 20 20 20 20 20  ocOrFree(.      
33e0: 20 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20          db,.    
33f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3400: 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20  ->apVarExpr,.   
3410: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
3420: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
3430: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
3440: 61 70 56 61 72 45 78 70 72 5b 30 5d 29 0a 20 20  apVarExpr[0]).  
3450: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
3460: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
3470: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3480: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
3490: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
34a0: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
34b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
34c0: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
34d0: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
34e0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
34f0: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
3500: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
3510: 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c 49 54 45  rse->nVar>SQLITE
3520: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
3530: 4d 42 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  MBER ){.    sqli
3540: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3550: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51  se, "too many SQ
3560: 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20  L variables");. 
3570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75   }.}../*.** Recu
3580: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
3590: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
35a0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
35b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
35c0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
35d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
35e0: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
35f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68  sqlite3_free((ch
3600: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a  ar*)p->span.z);.
3610: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
3620: 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  yn ) sqlite3_fre
3630: 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  e((char*)p->toke
3640: 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  n.z);.  sqlite3E
3650: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65  xprDelete(p->pLe
3660: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ft);.  sqlite3Ex
3670: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67  prDelete(p->pRig
3680: 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ht);.  sqlite3Ex
3690: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
36a0: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
36b0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d  3SelectDelete(p-
36c0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
36d0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
36e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  ./*.** The Expr.
36f0: 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67 68  token field migh
3700: 74 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69  t be a string li
3710: 74 65 72 61 6c 20 74 68 61 74 20 69 73 20 71 75  teral that is qu
3720: 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20  oted..** If so, 
3730: 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74 61  remove the quota
3740: 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76  tion marks..*/.v
3750: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75 6f  oid sqlite3Dequo
3760: 74 65 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a  teExpr(sqlite3 *
3770: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
3780: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
3790: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71  operty(p, EP_Deq
37a0: 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65  uoted) ){.    re
37b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72  turn;.  }.  Expr
37c0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
37d0: 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69  P_Dequoted);.  i
37e0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d  f( p->token.dyn=
37f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3800: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
3810: 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f  p->token, &p->to
3820: 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ken);.  }.  sqli
3830: 74 65 33 44 65 71 75 6f 74 65 28 28 63 68 61 72  te3Dequote((char
3840: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d  *)p->token.z);.}
3850: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
3860: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
3870: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
3880: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
3890: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
38a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
38b0: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
38c0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
38d0: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
38e0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
38f0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
3900: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
3910: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
3920: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
3930: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
3940: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
3950: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
3960: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
3970: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
3980: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
3990: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
39a0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
39b0: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
39c0: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
39d0: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
39e0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
39f0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
3a00: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
3a10: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
3a20: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
3a30: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
3a40: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
3a50: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
3a60: 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ated..*/.Expr *s
3a70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 73 71  qlite3ExprDup(sq
3a80: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
3a90: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
3aa0: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
3ab0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3ac0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3ad0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
3ae0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
3af0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3b00: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c  ;.  memcpy(pNew,
3b10: 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   p, sizeof(*pNew
3b20: 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  ));.  if( p->tok
3b30: 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70  en.z!=0 ){.    p
3b40: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28  New->token.z = (
3b50: 75 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72  u8*)sqlite3DbStr
3b60: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
3b70: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74  p->token.z, p->t
3b80: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65  oken.n);.    pNe
3b90: 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31  w->token.dyn = 1
3ba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3bb0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
3bc0: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  en.z==0 );.  }. 
3bd0: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
3be0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  0;.  pNew->pLeft
3bf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3c00: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  p(db, p->pLeft);
3c10: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
3c20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3c30: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b  (db, p->pRight);
3c40: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
3c50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3c60: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 73 74  Dup(db, p->pList
3c70: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65  );.  pNew->pSele
3c80: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
3c90: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 65  ctDup(db, p->pSe
3ca0: 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  lect);.  return 
3cb0: 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  pNew;.}.void sql
3cc0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 73 71  ite3TokenCopy(sq
3cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
3ce0: 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46   *pTo, Token *pF
3cf0: 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d  rom){.  if( pTo-
3d00: 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66  >dyn ) sqlite3_f
3d10: 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e  ree((char*)pTo->
3d20: 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  z);.  if( pFrom-
3d30: 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e  >z ){.    pTo->n
3d40: 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20   = pFrom->n;.   
3d50: 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73   pTo->z = (u8*)s
3d60: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
3d70: 64 62 2c 20 28 63 68 61 72 2a 29 70 46 72 6f 6d  db, (char*)pFrom
3d80: 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a  ->z, pFrom->n);.
3d90: 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31      pTo->dyn = 1
3da0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3db0: 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d  To->z = 0;.  }.}
3dc0: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
3dd0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71  e3ExprListDup(sq
3de0: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c  lite3 *db, ExprL
3df0: 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c  ist *p){.  ExprL
3e00: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72  ist *pNew;.  str
3e10: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
3e20: 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49  m *pItem, *pOldI
3e30: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
3e40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3e50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
3e60: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3e70: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
3e80: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
3e90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3ea0: 20 20 70 4e 65 77 2d 3e 69 45 43 75 72 73 6f 72    pNew->iECursor
3eb0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45   = 0;.  pNew->nE
3ec0: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
3ed0: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
3ee0: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
3ef0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3f00: 6f 63 52 61 77 28 64 62 2c 20 20 70 2d 3e 6e 45  ocRaw(db,  p->nE
3f10: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
3f20: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
3f30: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
3f40: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
3f50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3f60: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
3f70: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
3f80: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
3f90: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
3fa0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
3fb0: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
3fc0: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
3fd0: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
3fe0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
3ff0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70  rDup(db, pOldExp
4000: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
4010: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  xpr);.    if( pO
4020: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ldExpr->span.z!=
4030: 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  0 && pNewExpr ){
4040: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
4050: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
4060: 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70  the span for top
4070: 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f  -level expressio
4080: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
4090: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
40a0: 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69  st.  The logic i
40b0: 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73  n SELECT process
40c0: 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69  ing that determi
40d0: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nes.      ** the
40e0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
40f0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
4100: 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69  set needs this i
4110: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
4120: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
4130: 43 6f 70 79 28 64 62 2c 20 26 70 4e 65 77 45 78  Copy(db, &pNewEx
4140: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45  pr->span, &pOldE
4150: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
4160: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  }.    assert( pN
4170: 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65  ewExpr==0 || pNe
4180: 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  wExpr->span.z!=0
4190: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
41a0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
41b0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  z==0.           
41c0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
41d0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65  iled );.    pIte
41e0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
41f0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
4200: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4210: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
4220: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
4230: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
4240: 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20   pItem->isAgg = 
4250: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b  pOldItem->isAgg;
4260: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
4270: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4280: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4290: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
42a0: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
42b0: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
42c0: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
42d0: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
42e0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
42f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
4300: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
4310: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
4320: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
4330: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
4340: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
4350: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
4360: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
4370: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
4380: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4390: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
43a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
43b0: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
43c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
43d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
43e0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
43f0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
4400: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
4410: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
4420: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
4430: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
4440: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
4450: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
4460: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
4470: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
4480: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
4490: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
44a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
44b0: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
44c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
44d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
44e0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
44f0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
4500: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
4510: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
4520: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4530: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4540: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4550: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
4560: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
4570: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
4580: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
4590: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
45a0: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
45b0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
45c0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
45d0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
45e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
45f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
4600: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
4610: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
4620: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
4630: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
4640: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
4650: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
4660: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
4670: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
4680: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
4690: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
46a0: 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74  rsor;.    pNewIt
46b0: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
46c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f  = pOldItem->isPo
46d0: 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61  pulated;.    pTa
46e0: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
46f0: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
4700: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
4710: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
4720: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
4730: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
4740: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
4750: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  lectDup(db, pOld
4760: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
4770: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
4780: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
4790: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
47a0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49  >pOn);.    pNewI
47b0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
47c0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
47d0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
47e0: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
47f0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
4800: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
4810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
4820: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
4830: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
4840: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
4850: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
4860: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
4870: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
4880: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
4890: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
48a0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
48b0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
48c0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
48d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
48e0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
48f0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
4900: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
4910: 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49  locRaw(db, p->nI
4920: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
4930: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
4940: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
4950: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
4960: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4970: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4980: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
4990: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
49a0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
49b0: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
49c0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
49d0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
49e0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
49f0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
4a00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
4a10: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
4a20: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
4a30: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
4a40: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
4a50: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
4a60: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
4a70: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
4a80: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
4a90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
4aa0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
4ab0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
4ac0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
4ad0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
4ae0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
4af0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4b00: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
4b10: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
4b20: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ct;.  pNew->pELi
4b30: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
4b40: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
4b50: 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  EList);.  pNew->
4b60: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
4b70: 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  cListDup(db, p->
4b80: 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  pSrc);.  pNew->p
4b90: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
4ba0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
4bb0: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
4bc0: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
4bd0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
4be0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
4bf0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
4c00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4c10: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
4c20: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
4c30: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4c40: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
4c50: 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d  rderBy);.  pNew-
4c60: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
4c70: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
4c80: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
4c90: 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
4ca0: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
4cb0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
4cc0: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
4cd0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
4ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4cf0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
4d00: 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20  .  pNew->iLimit 
4d10: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  = -1;.  pNew->iO
4d20: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  ffset = -1;.  pN
4d30: 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d  ew->isResolved =
4d40: 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a   p->isResolved;.
4d50: 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20    pNew->isAgg = 
4d60: 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e 65 77  p->isAgg;.  pNew
4d70: 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 30 3b 0a  ->usesEphm = 0;.
4d80: 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c 6f 77    pNew->disallow
4d90: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70  OrderBy = 0;.  p
4da0: 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  New->pRightmost 
4db0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64  = 0;.  pNew->add
4dc0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
4dd0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
4de0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
4df0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
4e00: 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
4e10: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4e20: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
4e30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
4e40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
4e50: 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ct *p){.  assert
4e60: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
4e70: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
4e80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
4e90: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
4ea0: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
4eb0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
4ec0: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
4ed0: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
4ee0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
4ef0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4f00: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
4f10: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4f20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4f30: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
4f40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4f50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
4f60: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
4f70: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
4f80: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
4f90: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
4fa0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
4fb0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
4fc0: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
4fd0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4fe0: 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
4ff0: 41 53 20 6b 65 79 77 6f 72 64 20 66 6f 72 20 74  AS keyword for t
5000: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
5010: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5030: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5040: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
5050: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
5060: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  o(db, sizeof(Exp
5070: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
5080: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
5090: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
50a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
50b0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
50c0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
50d0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
50e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
50f0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
5100: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
5110: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
5120: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
5130: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 72 65    a = sqlite3_re
5140: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
5150: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
5160: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
5170: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
5180: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
5190: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
51a0: 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  a;.    pList->nA
51b0: 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  lloc = n;.  }.  
51c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
51d0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
51e0: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
51f0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
5200: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
5210: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
5220: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
5230: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
5240: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
5250: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
5260: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5270: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5280: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
5290: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
52a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
52b0: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
52c0: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
52d0: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
52e0: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
52f0: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f  . */.  db->mallo
5300: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73  cFailed = 1;.  s
5310: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5320: 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  (pExpr);.  sqlit
5330: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
5340: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
5350: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
5360: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5370: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
5380: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
5390: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
53a0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
53b0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
53c0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
53d0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
53e0: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
53f0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
5400: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
5410: 69 6e 74 20 69 4c 69 6d 69 74 2c 0a 20 20 63 6f  int iLimit,.  co
5420: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63  nst char *zObjec
5430: 74 0a 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73  t.){.  if( pELis
5440: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
5450: 70 72 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  pr>iLimit ){.   
5460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5470: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
5480: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73  ny columns in %s
5490: 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d  ", zObject);.  }
54a0: 0a 7d 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  .}...#if SQLITE_
54b0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
54c0: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
54d0: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
54e0: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
54f0: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
5500: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
5510: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
5520: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
5530: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
5540: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
5550: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
5560: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
5570: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5580: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
5590: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
55a0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
55b0: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
55c0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
55d0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
55e0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
55f0: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
5600: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
5610: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
5620: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
5630: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
5640: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
5650: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
5660: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
5670: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
5680: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
5690: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
56a0: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
56b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
56c0: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
56d0: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
56e0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
56f0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5700: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5710: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5720: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5730: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
5740: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
5750: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
5760: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
5770: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
5780: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
5790: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
57a0: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
57b0: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
57c0: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
57d0: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
57e0: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
57f0: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
5800: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
5810: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5820: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5830: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
5840: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5850: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
5860: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
5870: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5880: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
5890: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
58a0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
58b0: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
58c0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
58d0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
58e0: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
58f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5900: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
5910: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
5920: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
5930: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
5940: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
5950: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
5960: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
5970: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
5980: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
5990: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
59a0: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
59b0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
59c0: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
59d0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
59e0: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
59f0: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
5a00: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
5a10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
5a20: 70 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72  prSetHeight(Expr
5a30: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
5a40: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
5a50: 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  tOfExpr(p->pLeft
5a60: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5a70: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
5a80: 52 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29  Right, &nHeight)
5a90: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5aa0: 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26  List(p->pList, &
5ab0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67  nHeight);.  heig
5ac0: 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53  htOfSelect(p->pS
5ad0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
5ae0: 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  ;.  p->nHeight =
5af0: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
5b00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5b10: 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  e maximum height
5b20: 20 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   of any expressi
5b30: 6f 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63  on tree referenc
5b40: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c  ed.** by the sel
5b50: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
5b60: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
5b70: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
5b80: 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
5b90: 67 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ght(Select *p){.
5ba0: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
5bb0: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c  0;.  heightOfSel
5bc0: 65 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29  ect(p, &nHeight)
5bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67  ;.  return nHeig
5be0: 68 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ht;.}.#endif../*
5bf0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
5c00: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
5c10: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
5c20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5c30: 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ete(ExprList *pL
5c40: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
5c50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5c60: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5c70: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
5c80: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
5c90: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
5ca0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30  (pList->nExpr==0
5cb0: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   && pList->nAllo
5cc0: 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  c==0) );.  asser
5cd0: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  t( pList->nExpr<
5ce0: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
5cf0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
5d00: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
5d10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
5d20: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
5d30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5d40: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  e(pItem->pExpr);
5d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5d60: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
5d70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5d80: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
5d90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
5da0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
5db0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
5dc0: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
5dd0: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
5de0: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
5df0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
5e00: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
5e10: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
5e20: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
5e30: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
5e40: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
5e50: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
5e60: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
5e70: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
5e80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
5e90: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
5ea0: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
5eb0: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
5ec0: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
5ed0: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
5ee0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
5ef0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
5f00: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
5f10: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
5f20: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
5f30: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
5f40: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
5f50: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
5f60: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
5f70: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
5f80: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
5f90: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
5fa0: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
5fb0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
5fc0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
5fd0: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
5fe0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
5ff0: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
6000: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
6010: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
6020: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
6030: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
6040: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
6050: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
6060: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
6070: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
6080: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
6090: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
60a0: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
60b0: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
60c0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
60d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
60e0: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
60f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
6100: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
6110: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
6120: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
6130: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
6140: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
6150: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
6160: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
6170: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
6180: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
6190: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
61a0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
61b0: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
61c0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
61d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
61e0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
61f0: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
6200: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
6210: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
6220: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
6230: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
6240: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
6250: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
6260: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
6270: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
6280: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
6290: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
62a0: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
62b0: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
62c0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
62d0: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
62e0: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
62f0: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
6300: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
6310: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
6320: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
6330: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
6340: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
6350: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
6360: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
6370: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
6380: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
6390: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
63a0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
63b0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
63c0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
63d0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
63e0: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
63f0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
6400: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
6410: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
6420: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
6430: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
6440: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pArg);.  if( p->
6450: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 77 61  pPrior ){.    wa
6460: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 2d 3e  lkSelectExpr(p->
6470: 70 50 72 69 6f 72 2c 20 78 46 75 6e 63 2c 20 70  pPrior, xFunc, p
6480: 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Arg);.  }.  retu
6490: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
64a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
64b0: 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78  designed as an x
64c0: 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70  Func for walkExp
64d0: 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70  rTree()..**.** p
64e0: 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20  Arg is really a 
64f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6500: 74 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61  teger.  If we ca
6510: 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e  n tell by lookin
6520: 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68  g.** at pExpr th
6530: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
6540: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
6550: 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63  pExpr is not a c
6560: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65  onstant.** expre
6570: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20  ssion, then set 
6580: 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72  *pArg to 0 and r
6590: 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64  eturn 2 to aband
65a0: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
65b0: 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f  ..** If pExpr do
65c0: 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71  es does not disq
65d0: 75 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65  ualify the expre
65e0: 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67  ssion from being
65f0: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74   a constant.** t
6600: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
6610: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b  **.** After walk
6620: 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ing the whole tr
6630: 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20  ee, if no nodes 
6640: 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64  are found that d
6650: 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65  isqualify.** the
6660: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63   expression as c
6670: 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65  onstant, then we
6680: 20 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c   assume the whol
6690: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
66a0: 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65  is constant.  Se
66b0: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  e sqlite3ExprIsC
66c0: 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64  onstant() for ad
66d0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
66e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
66f0: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
6700: 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72  nstant(void *pAr
6710: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
6720: 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20 28 69 6e  .  int *pN = (in
6730: 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f 2a 20 49  t*)pArg;..  /* I
6740: 66 20 2a 70 41 72 67 20 69 73 20 33 20 74 68 65  f *pArg is 3 the
6750: 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68  n any term of th
6760: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
6770: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a  t comes from.  *
6780: 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  * the ON or USIN
6790: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
67a0: 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73  oin disqualifies
67b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
67c0: 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20    ** from being 
67d0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74  considered const
67e0: 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 28 2a  ant. */.  if( (*
67f0: 70 4e 29 3d 3d 33 20 26 26 20 45 78 70 72 48 61  pN)==3 && ExprHa
6800: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
6810: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
6820: 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d 20 30 3b   ){.    *pN = 0;
6830: 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
6840: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
6850: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f  xpr->op ){.    /
6860: 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74  * Consider funct
6870: 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  ions to be const
6880: 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72  ant if all their
6890: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63   arguments are c
68a0: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61  onstant.    ** a
68b0: 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20  nd *pArg==2 */. 
68c0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
68d0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 28  ION:.      if( (
68e0: 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74 75 72 6e  *pN)==2 ) return
68f0: 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
6900: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
6910: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
6920: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
6940: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
6950: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6960: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
6970: 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  MN:.#ifndef SQLI
6980: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6990: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
69a0: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
69b0: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
69c0: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
69d0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
69e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20     case TK_IN:. 
69f0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
6a00: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6a10: 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20 20     *pN = 0;.    
6a20: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
6a30: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6a40: 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
6a50: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
6a60: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
6a70: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
6a80: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6a90: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
6aa0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
6ab0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
6ac0: 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63  es or function c
6ad0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  alls..**.** For 
6ae0: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
6af0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
6b00: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
6b10: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
6b20: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
6b30: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
6b40: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
6b50: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
6b60: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
6b70: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
6b80: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6b90: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
6ba0: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b  int isConst = 1;
6bb0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6bc0: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6bd0: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6be0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6bf0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  st;.}../*.** Wal
6c00: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
6c10: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
6c20: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
6c30: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
6c40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72   that does no or
6c50: 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65  iginate from the
6c60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
6c70: 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a  uses of a join..
6c80: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
6c90: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
6ca0: 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e  bles or function
6cb0: 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20   calls or terms 
6cc0: 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72  from.** an ON or
6cd0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
6ce0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
6cf0: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
6d00: 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  in(Expr *p){.  i
6d10: 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b 0a  nt isConst = 3;.
6d20: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
6d30: 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  , exprNodeIsCons
6d40: 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b  tant, &isConst);
6d50: 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73  .  return isCons
6d60: 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  t!=0;.}../*.** W
6d70: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
6d80: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
6d90: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
6da0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
6db0: 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e  ** or a function
6dc0: 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74   call with const
6dd0: 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ant arguments.  
6de0: 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66 20  Return and 0 if 
6df0: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79  there.** are any
6e00: 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   variables..**.*
6e10: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6e20: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
6e30: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
6e40: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
6e50: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
6e60: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
6e70: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
6e80: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6e90: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
6ea0: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
6eb0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
6ec0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
6ed0: 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ion(Expr *p){.  
6ee0: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32 3b  int isConst = 2;
6ef0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
6f00: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
6f10: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
6f20: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
6f30: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
6f40: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
6f50: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
6f60: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
6f70: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
6f80: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
6f90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
6fa0: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
6fb0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
6fc0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
6fd0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
6fe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
6ff0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
7000: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
7010: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
7020: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
7030: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
7040: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
7050: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
7060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
7070: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
7080: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
7090: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
70a0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
70b0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
70c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
70d0: 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d 3e  Int32((char*)p->
70e0: 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29  token.z, pValue)
70f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7100: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
7130: 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  US: {.      retu
7140: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  rn sqlite3ExprIs
7150: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
7160: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d  , pValue);.    }
7170: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
7180: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NUS: {.      int
7190: 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   v;.      if( sq
71a0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
71b0: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29  er(p->pLeft, &v)
71c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61   ){.        *pVa
71d0: 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20  lue = -v;.      
71e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
71f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7200: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7210: 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  lt: break;.  }. 
7220: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7230: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
7240: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
7250: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
7260: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
7270: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
7280: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
7290: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
72a0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
72b0: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
72c0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
72d0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
72e0: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
72f0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7300: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
7310: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
7320: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
7330: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
7340: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
7350: 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  mn of the form X
7360: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
7370: 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a  ust Z, look up.*
7380: 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74  * that name in t
7390: 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65  he set of source
73a0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c   tables in pSrcL
73b0: 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65  ist and make the
73c0: 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65   pExpr .** expre
73d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
73e0: 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f   back to that so
73f0: 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  urce column.  Th
7400: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
7410: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
7420: 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20  to pExpr:.**.** 
7430: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20     pExpr->iDb   
7440: 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65 20          Set the 
7450: 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62  index in db->aDb
7460: 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
7470: 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20  se holding.**   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e        the table.
74a0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
74b0: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
74c0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
74d0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
74e0: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le obtained.**  
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63         from pSrc
7510: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
7520: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20  r->iColumn      
7530: 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   Set to the colu
7540: 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
7550: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
7560: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
7570: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b         Set to TK
7580: 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70  _COLUMN..**    p
7590: 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20  Expr->pLeft     
75a0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
75b0: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
75c0: 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  o is deleted.** 
75d0: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
75e0: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
75f0: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
7600: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
7610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54  ..**.** The pDbT
7620: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
7630: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
7640: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
7650: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
7660: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
7670: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
7680: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
7690: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
76a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
76b0: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70   be used.  The p
76c0: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68  TableToken is th
76d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
76e0: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
76f0: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
7700: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62  n be NULL if pDb
7710: 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55  Token is also NU
7720: 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f  LL.  If pTableTo
7730: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ken is NULL it.*
7740: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
7750: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
7760: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
7770: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
7780: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
7790: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
77a0: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
77b0: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
77c0: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
77d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
77e0: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
77f0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
7800: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
7810: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
7820: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
7830: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
7840: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
7850: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
7860: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
7870: 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f  *pDbToken,     /
7880: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
7890: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
78a0: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
78b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
78c0: 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61  bleToken,  /* Na
78d0: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
78e0: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
78f0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
7900: 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c  n *pColumnToken,
7910: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7920: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d  column. */.  Nam
7930: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
7940: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
7950: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
7960: 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a  solve the name *
7970: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
7990: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
79a0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
79b0: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
79c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
79d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
79e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
79f0: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
7a00: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
7a10: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
7a20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
7a30: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
7a40: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
7a50: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
7a60: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
7a70: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
7a80: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
7a90: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
7aa0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7ab0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
7ac0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7ad0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
7ae0: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
7af0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
7b00: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
7b10: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
7b20: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
7b30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7b40: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
7b50: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
7b60: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
7b70: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
7b80: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
7b90: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
7ba0: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
7bb0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
7bc0: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
7bd0: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
7be0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
7bf0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
7c00: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
7c10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
7c20: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
7c30: 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e list */..  ass
7c40: 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ert( pColumnToke
7c50: 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  n && pColumnToke
7c60: 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a  n->z ); /* The Z
7c70: 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74   in X.Y.Z cannot
7c80: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44   be NULL */.  zD
7c90: 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  b = sqlite3NameF
7ca0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 62  romToken(db, pDb
7cb0: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
7cc0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7cd0: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
7ce0: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
7cf0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7d00: 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 75 6d  Token(db, pColum
7d10: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 64  nToken);.  if( d
7d20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7d30: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  ){.    goto look
7d40: 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a  upname_end;.  }.
7d50: 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
7d60: 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20   = -1;.  while( 
7d70: 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b  pNC && cnt==0 ){
7d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
7d90: 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69  EList;.    SrcLi
7da0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
7db0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20  NC->pSrcList;.. 
7dc0: 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20     if( pSrcList 
7dd0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
7de0: 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74  , pItem=pSrcList
7df0: 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  ->a; i<pSrcList-
7e00: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
7e10: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61  m++){.        Ta
7e20: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
7e30: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
7e40: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
7e50: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54 61  ;.  .        pTa
7e60: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
7e70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e80: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
7e90: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
7ea0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
7eb0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
7ec0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7ed0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
7ee0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
7ef0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
7f00: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
7f10: 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  as ){.          
7f20: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
7f30: 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   = pItem->zAlias
7f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7f50: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
7f60: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29  (zTabName, zTab)
7f70: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
7f80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
7f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
7fa0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54  r *zTabName = pT
7fb0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7fc0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
7fd0: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
7fe0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
7ff0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f  e, zTab)!=0 ) co
8000: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8010: 20 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26      if( zDb!=0 &
8020: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8030: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  (db->aDb[iDb].zN
8040: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
8060: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8070: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8080: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8090: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
80a0: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
80b0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
80c0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
80d0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  r;.          pEx
80e0: 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54  pr->pSchema = pT
80f0: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
8100: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
8110: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d  pItem;.        }
8120: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8130: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
8140: 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
8150: 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   j++, pCol++){. 
8160: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
8170: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
8180: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
8190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
81a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
81b0: 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
81c0: 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
81d0: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55        IdList *pU
81e0: 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20  sing;.          
81f0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
8200: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
8210: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
8220: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sor;.           
8230: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
8240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
8250: 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54  pr->pSchema = pT
8260: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
8270: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73           /* Subs
8280: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
8290: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
82a0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
82b0: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
82c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
82d0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
82e0: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
82f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
8300: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
8310: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
8320: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
8330: 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
8340: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
8350: 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20  llate)==0 ){.   
8360: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
8370: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
8380: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
8390: 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
83a0: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  -1, 0);.        
83b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
83c0: 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73 74    if( i<pSrcList
83d0: 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20  ->nSrc-1 ){.    
83e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
83f0: 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[1].jointype 
8400: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
8430: 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68 65   occurred in the
8440: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
8450: 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20   natural join,. 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
8470: 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  * then skip the 
8480: 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61  right table to a
8490: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
84a0: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
84b0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
84c0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
84d0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
84e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
84f0: 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b  (pUsing = pItem[
8500: 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b  1].pUsing)!=0 ){
8510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8520: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
8530: 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f  h occurs on a co
8540: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20  lumn that is in 
8550: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
8560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8570: 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73   ** of a join, s
8580: 6b 69 70 20 74 68 65 20 73 65 61 72 63 68 20 6f  kip the search o
8590: 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
85a0: 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20  e of the join.  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
85c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c   to avoid a dupl
85d0: 69 63 61 74 65 20 6d 61 74 63 68 20 74 68 65 72  icate match ther
85e0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
85f0: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
8610: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
8620: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8640: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8650: 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61  pUsing->a[k].zNa
8660: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20      pItem++;.   
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86a0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
86b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
86c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
86e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
86f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8720: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
8740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8750: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20  _TRIGGER.    /* 
8760: 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61  If we have not a
8770: 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20  lready resolved 
8780: 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d  the name, then m
8790: 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20  aybe .    ** it 
87a0: 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c  is a new.* or ol
87b0: 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75  d.* trigger argu
87c0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20  ment reference. 
87d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44     */.    if( zD
87e0: 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20  b==0 && zTab!=0 
87f0: 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61  && cnt==0 && pPa
8800: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d  rse->trigStack!=
8810: 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67  0 ){.      Trigg
8820: 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65  erStack *pTrigge
8830: 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d  rStack = pParse-
8840: 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20  >trigStack;.    
8850: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8860: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  0;.      if( pTr
8870: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49  iggerStack->newI
8880: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
8890: 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22  te3StrICmp("new"
88a0: 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a  , zTab) == 0 ){.
88b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
88c0: 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72  Table = pTrigger
88d0: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20  Stack->newIdx;. 
88e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
88f0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
8900: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ab );.        pT
8910: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
8920: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ck->pTab;.      
8930: 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67  }else if( pTrigg
8940: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20  erStack->oldIdx 
8950: 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33  != -1 && sqlite3
8960: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a  StrICmp("old", z
8970: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
8980: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
8990: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
89a0: 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20  ->oldIdx;.      
89b0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
89c0: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
89d0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
89e0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
89f0: 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Tab;.      }..  
8a00: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20      if( pTab ){ 
8a10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
8a20: 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  l;.        Colum
8a30: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
8a40: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
8a50: 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20  Expr->pSchema = 
8a60: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
8a70: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
8a80: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
8a90: 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62  l=0; iCol < pTab
8aa0: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20  ->nCol; iCol++, 
8ab0: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
8ac0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8ad0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
8ae0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
8b00: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
8b10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8b20: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
8b30: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
8b40: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
8b50: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54  olumn = iCol==pT
8b60: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
8b70: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   iCol;.         
8b80: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
8b90: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
8ba0: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  iCol].affinity;.
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8bc0: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
8bd0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d  EP_ExpCollate)==
8be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8bf0: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
8c00: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8c10: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
8c20: 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a  , zColl,-1, 0);.
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8c40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8c50: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
8c60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8c70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8c80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8c90: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
8ca0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8cb0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
8cc0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
8cd0: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
8ce0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
8cf0: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
8d00: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
8d10: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
8d20: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
8d30: 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zCol) ){.      
8d40: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
8d50: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
8d60: 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  -1;.      pExpr-
8d70: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
8d80: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
8d90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
8da0: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
8db0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
8dc0: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
8dd0: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
8de0: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
8df0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
8e00: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
8e10: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
8e20: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
8e30: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
8e40: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
8e50: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
8e60: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
8e70: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
8e80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
8e90: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
8ea0: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
8eb0: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
8ec0: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
8ed0: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
8ee0: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
8ef0: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
8f00: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
8f10: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
8f20: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
8f30: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
8f40: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
8f50: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
8f60: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
8f70: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
8f80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
8f90: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
8fa0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
8fb0: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
8fc0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
8fd0: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
8fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
8ff0: 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74  nt==0 && (pEList
9000: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21   = pNC->pEList)!
9010: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
9020: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9030: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
9040: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
9050: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
9060: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
9070: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
9080: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
9090: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
90a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
90b0: 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69  xpr *pDup, *pOri
90c0: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  g;.          ass
90d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
90e0: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
90f0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
9100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
9110: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
9120: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9130: 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  t( pExpr->pSelec
9140: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
9150: 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74    pOrig = pEList
9160: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[j].pExpr;.  
9170: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 43          if( !pNC
9180: 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78  ->allowAgg && Ex
9190: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
91a0: 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  rig, EP_Agg) ){.
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
91c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
91d0: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
91e0: 6c 69 61 73 65 64 20 61 67 67 72 65 67 61 74 65  liased aggregate
91f0: 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20   %s", zAs);.    
9200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9210: 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  free(zCol);.    
9220: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
9230: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9240: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
9250: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9260: 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20  , pOrig);.      
9270: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
9280: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
9290: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
92a0: 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20      pDup->pColl 
92b0: 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70              pDup
92d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
92e0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
92f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9300: 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  if( pExpr->span.
9310: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
9320: 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  ee((char*)pExpr-
9330: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  >span.z);.      
9340: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
9350: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
9360: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
9370: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  Expr->token.z);.
9380: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9390: 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69  (pExpr, pDup, si
93a0: 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20  zeof(*pExpr));. 
93b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
93c0: 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20  _free(pDup);.   
93d0: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
93e0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
93f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9400: 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20  assert( zTab==0 
9410: 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20  && zDb==0 );.   
9420: 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b         goto look
9430: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20  upname_end_2;.  
9440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
9450: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
9460: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
9470: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  xt name context.
9480: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20    The loop will 
9490: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72  exit when either
94a0: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20  .    ** we have 
94b0: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20  a match (cnt>0) 
94c0: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f  or when we run o
94d0: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65  ut of name conte
94e0: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xts..    */.    
94f0: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
9500: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
9510: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9520: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
9530: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
9540: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
9550: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
9560: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
9570: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
9580: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
9590: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
95a0: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
95b0: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
95c0: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
95d0: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
95e0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
95f0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
9600: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
9610: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
9620: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
9630: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
9640: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
9650: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
9660: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
9670: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
9680: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
9690: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
96a0: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
96b0: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
96c0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
96d0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
96e0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b  pColumnToken->z[
96f0: 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73  0]=='"' ){.    s
9700: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9720: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9730: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
9740: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
9750: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
9760: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
9770: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
9780: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
9790: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
97a0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
97b0: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
97c0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
97d0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
97e0: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
97f0: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
9800: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
9810: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
9820: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
9830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
9840: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
9850: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
9860: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
9870: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
9880: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
9890: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
98a0: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
98b0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
98c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
98d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 44 75 70   = sqlite3StrDup
98e0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zCol);.    }.  
98f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9900: 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20  g(pParse, zErr, 
9910: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
9920: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f  free(z);.    pTo
9930: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  pNC->nErr++;.  }
9940: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
9950: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
9960: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
9970: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
9980: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
9990: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
99a0: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
99b0: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
99c0: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
99d0: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
99e0: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
99f0: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
9a00: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
9a10: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
9a20: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
9a30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9a40: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
9a50: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
9a60: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
9a70: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
9a80: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
9a90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
9aa0: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
9ab0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
9ac0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
9ad0: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
9ae0: 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  Bitmask)*8 ){.  
9af0: 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42      n = sizeof(B
9b00: 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20  itmask)*8-1;.   
9b10: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
9b20: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
9b30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
9b40: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
9b50: 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73  Used |= ((Bitmas
9b60: 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f  k)1)<<n;.  }..lo
9b70: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20  okupname_end:.  
9b80: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  /* Clean up and 
9b90: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
9ba0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 62 29 3b  lite3_free(zDb);
9bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9bc0: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  zTab);.  sqlite3
9bd0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
9be0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70  ->pLeft);.  pExp
9bf0: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
9c00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9c10: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
9c20: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
9c30: 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e  t = 0;.  pExpr->
9c40: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
9c50: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32  lookupname_end_2
9c60: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
9c70: 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e  (zCol);.  if( cn
9c80: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
9c90: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
9ca0: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
9cb0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
9cc0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b   pNC->pSrcList);
9cd0: 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20  .    if( pMatch 
9ce0: 26 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c  && !pMatch->pSel
9cf0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ect ){.      pEx
9d00: 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63  pr->pTab = pMatc
9d10: 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20  h->pTab;.    }. 
9d20: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
9d30: 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f  the nRef value o
9d40: 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65  n all name conte
9d50: 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75  xts from TopNC u
9d60: 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  p to.    ** the 
9d70: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
9d80: 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f  name matched. */
9d90: 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
9da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
9db0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  NC!=0 );.      p
9dc0: 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  TopNC->nRef++;. 
9dd0: 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d       if( pTopNC=
9de0: 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20  =pNC ) break;.  
9df0: 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f      pTopNC = pTo
9e00: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
9e10: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
9e20: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
9e30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
9e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9e50: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
9e60: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
9e70: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
9e80: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d  *.** Resolve sym
9e90: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f  bolic names into
9ea0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61   TK_COLUMN opera
9eb0: 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72  tors for the cur
9ec0: 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20  rent.** node in 
9ed0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
9ee0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74  ree.  Return 0 t
9ef0: 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73  o continue the s
9f00: 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68  earch down.** th
9f10: 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61  e tree or 2 to a
9f20: 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61  bort the tree wa
9f30: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  lk..**.** This r
9f40: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
9f50: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
9f60: 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  and name resolut
9f70: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74  ion for.** funct
9f80: 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20  ion names.  The 
9f90: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67  operator for agg
9fa0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
9fb0: 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74   is changed.** t
9fc0: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
9fd0: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
9fe0: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
9ff0: 70 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  p(void *pArg, Ex
a000: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61  pr *pExpr){.  Na
a010: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
a020: 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70   (NameContext*)p
a030: 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
a040: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70 45 78  arse;..  if( pEx
a050: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pr==0 ) return 1
a060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21  ;.  assert( pNC!
a070: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d  =0 );.  pParse =
a080: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pNC->pParse;.. 
a090: 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
a0a0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
a0b0: 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65  P_Resolved) ) re
a0c0: 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53 65  turn 1;.  ExprSe
a0d0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
a0e0: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
a0f0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
a100: 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  if( pNC->pSrcLis
a110: 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69  t && pNC->pSrcLi
a120: 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a  st->nAlloc>0 ){.
a130: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
a140: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
a150: 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  cList;.    int i
a160: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a170: 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e  <pNC->pSrcList->
a180: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
a190: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
a1a0: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
a1b0: 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d  >=0 && pSrcList-
a1c0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50  >a[i].iCursor<pP
a1d0: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20  arse->nTab);.   
a1e0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
a1f0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
a200: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
a210: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a220: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
a230: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
a240: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
a250: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
a260: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
a270: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
a280: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
a290: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
a2a0: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
a2b0: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
a2c0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
a2d0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
a2e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a2f0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
a300: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
a310: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
a320: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
a330: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
a340: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a350: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
a360: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
a370: 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d  ifier is the nam
a380: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20  e of a column.. 
a390: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
a3a0: 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f  K_ID: {.      lo
a3b0: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
a3c0: 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74   0, 0, &pExpr->t
a3d0: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
a3e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a3f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
a400: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
a410: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
a420: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
a430: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
a440: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
a450: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
a460: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
a470: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b  DOT: {.      Tok
a480: 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  en *pColumn;.   
a490: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65     Token *pTable
a4a0: 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  ;.      Token *p
a4b0: 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  Db;.      Expr *
a4c0: 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f  pRight;..      /
a4d0: 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d  * if( pSrcList==
a4e0: 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20  0 ) break; */.  
a4f0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
a500: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
a510: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
a520: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
a530: 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20     pDb = 0;.    
a540: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45      pTable = &pE
a550: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
a560: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75  n;.        pColu
a570: 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f  mn = &pRight->to
a580: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ken;.      }else
a590: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a5a0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
a5b0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _DOT );.        
a5c0: 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  pDb = &pExpr->pL
a5d0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
a5e0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52      pTable = &pR
a5f0: 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  ight->pLeft->tok
a600: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  en;.        pCol
a610: 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  umn = &pRight->p
a620: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
a630: 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b      }.      look
a640: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  upName(pParse, p
a650: 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c  Db, pTable, pCol
a660: 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  umn, pNC, pExpr)
a670: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
a680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a690: 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  Resolve function
a6a0: 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20   names.    */.  
a6b0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
a6c0: 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
a6d0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
a6e0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
a6f0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
a700: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72  st;    /* The ar
a710: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
a720: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69       int n = pLi
a730: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
a740: 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  r : 0;  /* Numbe
a750: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a760: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73  /.      int no_s
a770: 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20  uch_func = 0;   
a780: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
a790: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20  o such function 
a7a0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
a7b0: 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  int wrong_num_ar
a7c0: 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  gs = 0;     /* T
a7d0: 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d  rue if wrong num
a7e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a7f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
a800: 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  _agg = 0;       
a810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a820: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
a830: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
a840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
a850: 69 6e 74 20 61 75 74 68 3b 20 20 20 20 20 20 20  int auth;       
a860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a870: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
a880: 75 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  use the function
a890: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
a8a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a8b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a8c0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
a8d0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
a8e0: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
a8f0: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
a900: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
a910: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
a920: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
a930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a940: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
a950: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
a960: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
a970: 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
a980: 64 62 29 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  db);  /* The dat
a990: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
a9a0: 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  /..      zId = (
a9b0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
a9c0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
a9d0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
a9e0: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
a9f0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
aa00: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
aa10: 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c  Id, nId, n, enc,
aa20: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
aa30: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
aa40: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
aa50: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
aa60: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
aa70: 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a  d, -1, enc, 0);.
aa80: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
aa90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
aaa0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
aab0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
aac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e  {.          wron
aad0: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a  g_num_args = 1;.
aae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aaf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
ab00: 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46  s_agg = pDef->xF
ab10: 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a  unc==0;.      }.
ab20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ab30: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
ab40: 4e 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  N.      if( pDef
ab50: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 75 74 68   ){.        auth
ab60: 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68   = sqlite3AuthCh
ab70: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
ab80: 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20  TE_FUNCTION, 0, 
ab90: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pDef->zName, 0);
aba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74  .        if( aut
abb0: 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  h!=SQLITE_OK ){.
abc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75            if( au
abd0: 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20  th==SQLITE_DENY 
abe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
abf0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ac00: 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75 74 68  Parse, "not auth
ac10: 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20 66 75  orized to use fu
ac20: 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20  nction: %s",.   
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pDef->zName);. 
ac60: 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e             pNC->
ac70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
ac80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45    }.          pE
ac90: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
aca0: 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
acb0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
acc0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
acd0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
ace0: 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41   && !pNC->allowA
acf0: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gg ){.        sq
ad00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ad10: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
ad20: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
ad30: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  ion %.*s()", nId
ad40: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70  ,zId);.        p
ad50: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
ad60: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
ad70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ad80: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a  no_such_func ){.
ad90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ada0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
adb0: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
adc0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
add0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
ade0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
adf0: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
ae00: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
ae10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ae20: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
ae30: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
ae40: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
ae50: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
ae60: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
ae70: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
ae80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
ae90: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
aea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
aeb0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
aec0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
aed0: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31   pNC->hasAgg = 1
aee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aef0: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
af00: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  ->allowAgg = 0;.
af10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
af20: 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69  NC->nErr==0 && i
af30: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
af40: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
af50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
af60: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
af70: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20  ep, pNC);.      
af80: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
af90: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
afa0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  gg = 1;.      /*
afb0: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74   FIX ME:  Comput
afc0: 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  e pExpr->affinit
afd0: 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  y based on the e
afe0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20  xpected return. 
aff0: 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20       ** type of 
b000: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  the function .  
b010: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
b020: 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20 20 20  urn is_agg;.    
b030: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
b040: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
b050: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
b060: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  T:.    case TK_E
b070: 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20  XISTS:.#endif.  
b080: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
b090: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b0a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
b0b0: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70      int nRef = p
b0c0: 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65  NC->nRef;.#ifnde
b0d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b0e0: 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ECK.        if( 
b0f0: 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a  pNC->isCheck ){.
b100: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b110: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b120: 2c 22 73 75 62 71 75 65 72 69 65 73 20 70 72 6f  ,"subqueries pro
b130: 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b  hibited in CHECK
b140: 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
b150: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
b160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b170: 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
b180: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
b190: 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20  lect, pNC);.    
b1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d      assert( pNC-
b1b0: 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20  >nRef>=nRef );. 
b1c0: 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21         if( nRef!
b1d0: 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20  =pNC->nRef ){.  
b1e0: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
b1f0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
b200: 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20  P_VarSelect);.  
b210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b230: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b240: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20  E_OMIT_CHECK.   
b250: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
b260: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
b270: 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20  NC->isCheck ){. 
b280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
b290: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 70  rorMsg(pParse,"p
b2a0: 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68 69 62  arameters prohib
b2b0: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
b2c0: 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
b2d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b2e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b2f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
b300: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b310: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
b320: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
b330: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
b340: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
b350: 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65  e columns.  Node
b360: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44  s of the form ID
b370: 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76  .ID or ID resolv
b380: 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64  e into an.** ind
b390: 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ex to the table 
b3a0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
b3b0: 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f  t and a column o
b3c0: 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20  ffset.  The .** 
b3d0: 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20  Expr.opcode for 
b3e0: 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68  such nodes is ch
b3f0: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
b400: 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54  MN.  The Expr.iT
b410: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73  able.** value is
b420: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
b430: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66  index of the ref
b440: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e  erenced table in
b450: 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75   pTabList.** plu
b460: 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c  s the "base" val
b470: 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61  ue.  The base va
b480: 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  lue will ultimat
b490: 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a  ely become the.*
b4a0: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
b4b0: 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f  mber for a curso
b4c0: 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
b4d0: 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65  ng into the refe
b4e0: 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e  renced.** table.
b4f0: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
b500: 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  mn value is chan
b510: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
b520: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a   of the column .
b530: 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ** of the refere
b540: 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65  nced table.  The
b550: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
b560: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63  lue for the spec
b570: 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c  ial.** ROWID col
b580: 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20  umn is -1.  Any 
b590: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b5a0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72  KEY column is tr
b5b0: 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69  ied as an.** ali
b5c0: 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a  as for ROWID..**
b5d0: 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65  .** Also resolve
b5e0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20   function names 
b5f0: 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20 66 75  and check the fu
b600: 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70  nctions for prop
b610: 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61  er.** usage.  Ma
b620: 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75 6e 63  ke sure all func
b630: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20 72  tion names are r
b640: 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c  ecognized and al
b650: 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68  l functions.** h
b660: 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ave the correct 
b670: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
b680: 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20 65  nts.  Leave an e
b690: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
b6a0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
b6b0: 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  sg if anything i
b6c0: 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72 6e  s amiss.  Return
b6d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
b6e0: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
b6f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
b700: 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74  ontains aggregat
b710: 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e  e functions then
b720: 20 73 65 74 20 74 68 65 20 45 50 5f 41 67 67 0a   set the EP_Agg.
b730: 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74  ** property on t
b740: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
b750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b760: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 20 0a  rResolveNames( .
b770: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b780: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
b790: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
b7a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
b7b0: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  . */.  Expr *pEx
b7c0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
b7d0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b7e0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
b7f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76   */.){.  int sav
b800: 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28 20  edHasAgg;.  if( 
b810: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
b820: 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  n 0;.#if SQLITE_
b830: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
b840: 0a 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 6e  .  if( (pExpr->n
b850: 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72  Height+pNC->pPar
b860: 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 53 51 4c  se->nHeight)>SQL
b870: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
b880: 54 48 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  TH ){.    sqlite
b890: 33 45 72 72 6f 72 4d 73 67 28 70 4e 43 2d 3e 70  3ErrorMsg(pNC->p
b8a0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
b8b0: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
b8c0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
b8d0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
b8e0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
b8f0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 0a 20  MAX_EXPR_DEPTH. 
b900: 20 20 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e     );.    return
b910: 20 31 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 70   1;.  }.  pNC->p
b920: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
b930: 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  = pExpr->nHeight
b940: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64  ;.#endif.  saved
b950: 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61  HasAgg = pNC->ha
b960: 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73  sAgg;.  pNC->has
b970: 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45  Agg = 0;.  walkE
b980: 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e  xprTree(pExpr, n
b990: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
b9a0: 20 70 4e 43 29 3b 0a 23 69 66 20 53 51 4c 49 54   pNC);.#if SQLIT
b9b0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
b9c0: 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65  >0.  pNC->pParse
b9d0: 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78  ->nHeight -= pEx
b9e0: 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e  pr->nHeight;.#en
b9f0: 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  dif.  if( pNC->n
ba00: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
ba10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
ba20: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
ba30: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
ba40: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
ba50: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
ba60: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
ba70: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
ba80: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
ba90: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
baa0: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
bab0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
bac0: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
bad0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
bae0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
baf0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
bb00: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
bb10: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
bb20: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
bb30: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
bb40: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
bb50: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
bb60: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
bb70: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
bb80: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
bb90: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
bba0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
bbb0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
bbc0: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
bbd0: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
bbe0: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
bbf0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47   */.};.../*.** G
bc00: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
bc10: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
bc20: 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  es used as an ex
bc30: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20  pression.** and 
bc40: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
bc50: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
bc60: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
bc70: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
bc80: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
bc90: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
bca0: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
bcb0: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
bcc0: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
bcd0: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
bce0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
bcf0: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
bd00: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
bd10: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
bd20: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
bd30: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
bd40: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
bd50: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
bd60: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
bd70: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
bd80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
bd90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
bda0: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
bdb0: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66  subquery..*/.#if
bdc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bdd0: 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73  _SUBQUERY.void s
bde0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
bdf0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
be00: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
be10: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
be20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
be30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
be40: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
be50: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
be60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
be70: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
be80: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
be90: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
bea0: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
beb0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
bec0: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
bed0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
bee0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
bef0: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
bf00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
bf10: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
bf20: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
bf30: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
bf40: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
bf50: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
bf60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
bf70: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
bf80: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
bf90: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
bfa0: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
bfb0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
bfc0: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
bfd0: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
bfe0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
bff0: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
c000: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
c010: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
c020: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
c030: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
c040: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
c050: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
c060: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
c070: 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73  elect) && !pPars
c080: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a  e->trigStack ){.
c090: 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50      int mem = pP
c0a0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
c0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c0c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
c0d0: 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74  , mem, 0);.    t
c0e0: 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  estAddr = sqlite
c0f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c100: 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _If, 0, 0);.    
c110: 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72  assert( testAddr
c120: 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  >0 || pParse->db
c130: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c150: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c160: 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20  Int, 1, mem);.  
c170: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
c180: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
c190: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
c1a0: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
c1b0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b  .      KeyInfo k
c1c0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e  eyInfo;.      in
c1d0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f  t addr;        /
c1e0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
c1f0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
c200: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
c210: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
c220: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
c230: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
c240: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
c250: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
c260: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
c270: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
c280: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
c290: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
c2a0: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
c2b0: 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74  same way. A virt
c2c0: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ual table is .  
c2d0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
c2e0: 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
c2f0: 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
c300: 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
c310: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
c320: 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
c330: 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
c340: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c350: 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
c360: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c370: 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
c380: 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
c390: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
c3a0: 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
c3b0: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
c3c0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
c3d0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
c3e0: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
c3f0: 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
c400: 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
c410: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
c420: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
c430: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
c440: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
c450: 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
c460: 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
c470: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
c480: 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
c490: 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
c4a0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
c4b0: 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
c4c0: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
c4d0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
c4e0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
c4f0: 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
c500: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c510: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
c520: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c530: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c550: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
c560: 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  al, pExpr->iTabl
c570: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e, 0);.      mem
c580: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
c590: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
c5a0: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
c5b0: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20  .nField = 1;.   
c5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c5d0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
c5e0: 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e  Columns, pExpr->
c5f0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20  iTable, 1);..   
c600: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
c610: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
c620: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
c630: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
c640: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
c650: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
c660: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
c670: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
c680: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
c690: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
c6a0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
c6b0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
c6c0: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
c6d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
c6e0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72  nt iParm = pExpr
c6f0: 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69  ->iTable +  (((i
c700: 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36  nt)affinity)<<16
c710: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  );.        ExprL
c720: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
c730: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
c740: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
c750: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
c760: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
c770: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
c780: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
c790: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  r->pSelect, SRT_
c7a0: 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  Set, iParm, 0, 0
c7b0: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
c7c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c7e0: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
c7f0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
c800: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
c810: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
c820: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
c830: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
c840: 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69  l[0] = sqlite3Bi
c850: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
c860: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
c870: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
c880: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
c890: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
c8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c8b0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
c8c0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
c8d0: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
c8e0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
c8f0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c900: 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
c910: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
c920: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
c930: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
c940: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
c950: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
c960: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c970: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
c980: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
c990: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
c9a0: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
c9b0: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
c9c0: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
c9d0: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
c9e0: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
c9f0: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
ca00: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
ca10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ca20: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
ca30: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
ca40: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
ca50: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ca60: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
ca70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
ca80: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
ca90: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
caa0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
cab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cac0: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
cad0: 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  0] = pExpr->pLef
cae0: 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20  t->pColl;..     
caf0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
cb00: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
cb10: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
cb20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
cb30: 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
cb40: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
cb50: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
cb60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
cb70: 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d  xpr *pE2 = pItem
cb80: 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
cb90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
cba0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
cbb0: 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
cbc0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
cbd0: 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
cbe0: 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
cbf0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
cc00: 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
cc10: 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
cc20: 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
cc30: 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
cc40: 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
cc50: 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
cc60: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
cc70: 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
cc80: 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
cc90: 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
cca0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
ccb0: 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 30 20   if( testAddr>0 
ccc0: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
ccd0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
cce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ccf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
cd00: 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64  oNoop(v, testAdd
cd10: 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  r-1, 3);.       
cd20: 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20       testAddr = 
cd30: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
cd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
cd50: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
cd60: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
cd70: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
cd80: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
cd90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cda0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29  ode(pParse, pE2)
cdb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
cdc0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
cdd0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
cde0: 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
cdf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ce00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ce10: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
ce20: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
ce30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ce40: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ce50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ce60: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
ce70: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
ce80: 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  FO);.      break
ce90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
cea0: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
ceb0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
cec0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
ced0: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
cee0: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
cef0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
cf00: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
cf10: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
cf20: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
cf30: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
cf40: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
cf50: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
cf60: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
cf70: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
cf80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
cf90: 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38  oken one = { (u8
cfa0: 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20  *)"1", 0, 1 };. 
cfb0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
cfc0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65  l;.      int iMe
cfd0: 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 70  m;.      int sop
cfe0: 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ;..      pExpr->
cff0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d  iColumn = iMem =
d000: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
d010: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
d020: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
d030: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
d040: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
d050: 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52          sop = SR
d060: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  T_Mem;.        s
d070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d080: 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69  v, OP_MemNull, i
d090: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
d0a0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d0b0: 20 22 23 20 49 6e 69 74 20 73 75 62 71 75 65 72   "# Init subquer
d0c0: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
d0d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0e0: 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73    sop = SRT_Exis
d0f0: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
d100: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d110: 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 4d  OP_MemInt, 0, iM
d120: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  em);.        Vdb
d130: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
d140: 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75  Init EXISTS resu
d150: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lt"));.      }. 
d160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d170: 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69  Delete(pSel->pLi
d180: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  mit);.      pSel
d190: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
d1a0: 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45  e3Expr(TK_INTEGE
d1b0: 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a  R, 0, 0, &one);.
d1c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d1d0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d1e0: 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c  pSel, sop, iMem,
d1f0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a   0, 0, 0, 0) ){.
d200: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
d210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
d230: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29    if( testAddr )
d240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d250: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
d260: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  tAddr);.  }..  r
d270: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
d280: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
d290: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
d2a0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
d2b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
d2c0: 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
d2d0: 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
d2e0: 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
d2f0: 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  ] on the stack..
d300: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d310: 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20  odeInteger(Vdbe 
d320: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
d330: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61 73 73  z, int n){.  ass
d340: 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c  ert( z || v==0 |
d350: 7c 20 73 71 6c 69 74 65 33 44 62 4f 66 56 64 62  | sqlite3DbOfVdb
d360: 65 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e(v)->mallocFail
d370: 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b  ed );.  if( z ){
d380: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d390: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
d3a0: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
d3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
d3d0: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d  er, i, 0);.    }
d3e0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
d3f0: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20  FitsIn64Bits(z) 
d400: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d410: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  VdbeOp3(v, OP_In
d420: 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  t64, 0, 0, z, n)
d430: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d450: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
d460: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d   0, z, n);.    }
d470: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
d480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
d490: 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74  t will extract t
d4a0: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f  he iColumn-th co
d4b0: 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  lumn from.** tab
d4c0: 6c 65 20 70 54 61 62 20 61 6e 64 20 70 75 73 68  le pTab and push
d4d0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c   that column val
d4e0: 75 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ue on the stack.
d4f0: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e    There.** is an
d500: 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
d510: 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 2e 20  pTab in iTable. 
d520: 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
d530: 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
d540: 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
d550: 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
d560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d570: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
d580: 6e 28 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65  n(Vdbe *v, Table
d590: 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c   *pTab, int iCol
d5a0: 75 6d 6e 2c 20 69 6e 74 20 69 54 61 62 6c 65 29  umn, int iTable)
d5b0: 7b 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c  {.  if( iColumn<
d5c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  0 ){.    int op 
d5d0: 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72  = (pTab && IsVir
d5e0: 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50  tual(pTab)) ? OP
d5f0: 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77  _VRowid : OP_Row
d600: 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  id;.    sqlite3V
d610: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
d620: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65  iTable, 0);.  }e
d630: 6c 73 65 20 69 66 28 20 70 54 61 62 3d 3d 30 20  lse if( pTab==0 
d640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d650: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d660: 6c 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43  lumn, iTable, iC
d670: 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  olumn);.  }else{
d680: 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
d690: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
d6a0: 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
d6b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69  Column;.    sqli
d6c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d6d0: 6f 70 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  op, iTable, iCol
d6e0: 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
d6f0: 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
d700: 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29  , pTab, iColumn)
d710: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d720: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
d730: 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54 61  OINT.    if( pTa
d740: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  b->aCol[iColumn]
d750: 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
d760: 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20  E_AFF_REAL ){.  
d770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d780: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41  ddOp(v, OP_RealA
d790: 66 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a  ffinity, 0, 0);.
d7a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
d7b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d7c0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
d7d0: 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
d7e0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
d7f0: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
d800: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  n and leave the 
d810: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f  result on the to
d820: 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a  p of stack..**.*
d830: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
d840: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
d850: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
d860: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
d870: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
d880: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
d890: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
d8a0: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
d8b0: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
d8c0: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
d8d0: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
d8e0: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
d8f0: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
d900: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
d910: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
d920: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
d930: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
d940: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
d950: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
d960: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
d970: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
d980: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
d990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d9a0: 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
d9b0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
d9c0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
d9d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d9e0: 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74  int op;.  int st
d9f0: 61 63 6b 43 68 6e 67 20 3d 20 31 3b 20 20 20 20  ackChng = 1;    
da00: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61  /* Amount of cha
da10: 6e 67 65 20 74 6f 20 73 74 61 63 6b 20 64 65 70  nge to stack dep
da20: 74 68 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d  th */..  if( v==
da30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
da40: 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
da50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da60: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
da70: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
da80: 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78  ;.  }.  op = pEx
da90: 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68  pr->op;.  switch
daa0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
dab0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
dac0: 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
dad0: 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
dae0: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
daf0: 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
db00: 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
db10: 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
db20: 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
db30: 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
db40: 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
db50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
db60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
db70: 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65  mLoad, pCol->iMe
db80: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  m, 0);.        b
db90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
dba0: 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e  e if( pAggInfo->
dbb0: 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b  useSortingIdx ){
dbc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dbd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dbe0: 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
dbf0: 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  ->sortingIdx,.  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
dc20: 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29  ->iSorterColumn)
dc30: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dc40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
dc50: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
dc60: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
dc70: 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
dc80: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
dc90: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
dca0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
dcb0: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
dcc0: 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20     /* This only 
dcd0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64  happens when cod
dce0: 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72  ing check constr
dcf0: 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  aints */.       
dd00: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
dd10: 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20  >ckOffset>0 );. 
dd20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dd30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
dd40: 70 2c 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  p, pParse->ckOff
dd50: 73 65 74 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  set-pExpr->iColu
dd60: 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  mn-1, 1);.      
dd70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
dd80: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
dd90: 74 43 6f 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72  tColumn(v, pExpr
dda0: 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
ddb0: 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69  Column, pExpr->i
ddc0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Table);.      }.
ddd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dde0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ddf0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
de00: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
de10: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
de20: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
de30: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
de40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
de50: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
de60: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
de70: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
de80: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
de90: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
dea0: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
deb0: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
dec0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
ded0: 65 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62  eExpr(pParse->db
dee0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
def0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
df00: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63 68 61  , op, 0, 0, (cha
df10: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
df20: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
df30: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
df40: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
df50: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
df60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df70: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
df80: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
df90: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
dfa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
dfb0: 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
dfc0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
dfd0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
dfe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
dff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e000: 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62  BLOB==OP_HexBlob
e010: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45   );.      n = pE
e020: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33  xpr->token.n - 3
e030: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68 61  ;.      z = (cha
e040: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
e050: 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61 73 73  z + 2;.      ass
e060: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20  ert( n>=0 );.   
e070: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
e080: 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20         z = "";. 
e090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e0a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
e0b0: 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  p, 0, 0, z, n);.
e0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e0d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
e0e0: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
e0f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e100: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
e110: 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
e120: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
e130: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
e140: 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
e150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e160: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP3(v, -1, (ch
e170: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
e180: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
e190: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
e1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e1b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
e1c0: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
e1d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e1e0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
e1f0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
e200: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e210: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
e220: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
e230: 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
e240: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
e250: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
e260: 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
e270: 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
e280: 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f     int aff, to_o
e290: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
e2a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e2b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e2c0: 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
e2d0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
e2e0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a  &pExpr->token);.
e2f0: 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66        to_op = af
e300: 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
e310: 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
e320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e330: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20  o_op==OP_ToText 
e340: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e350: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b  E_AFF_TEXT    );
e360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e370: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20  o_op==OP_ToBlob 
e380: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e390: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b  E_AFF_NONE    );
e3a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e3b0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72  o_op==OP_ToNumer
e3c0: 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54  ic || aff!=SQLIT
e3d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
e3e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e3f0: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  o_op==OP_ToInt  
e400: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e410: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
e420: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74  .      assert( t
e430: 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20  o_op==OP_ToReal 
e440: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
e450: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b  E_AFF_REAL    );
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e470: 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f 6f 70  beAddOp(v, to_op
e480: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e490: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
e4a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e4b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e4c0: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
e4d0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
e4e0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
e4f0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
e500: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
e510: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
e520: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
e530: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e540: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
e550: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e560: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
e570: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
e580: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
e590: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
e5a0: 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
e5b0: 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
e5c0: 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
e5d0: 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
e5e0: 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
e5f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e600: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
e610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e620: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e630: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
e640: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
e650: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e660: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
e670: 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29  Right, op, 0, 0)
e680: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
e690: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72  g = -1;.      br
e6a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e6b0: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
e6c0: 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
e6d0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
e6e0: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
e6f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
e700: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
e710: 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
e720: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
e730: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
e740: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
e750: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
e760: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
e770: 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
e780: 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
e790: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
e7a0: 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
e7b0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
e7c0: 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
e7d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
e7e0: 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
e7f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
e800: 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
e810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e820: 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
e830: 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
e840: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
e850: 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
e860: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e870: 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
e880: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e890: 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
e8a0: 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
e8b0: 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
e8c0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
e8d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e8e0: 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
e8f0: 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
e900: 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
e910: 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
e920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e930: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e940: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
e950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e960: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e970: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
e980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e990: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
e9a0: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
e9b0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
e9c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e9d0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
e9e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
e9f0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
ea00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ea10: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
ea20: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
ea30: 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d  _FLOAT || pLeft-
ea40: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
ea50: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
ea60: 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f   *p = &pLeft->to
ea70: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ken;.        cha
ea80: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50  r *z = sqlite3MP
ea90: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
eaa0: 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c  , "-%.*s", p->n,
eab0: 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20   p->z);.        
eac0: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
ead0: 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
eae0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eaf0: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
eb00: 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  0, 0, z, p->n+1)
eb10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
eb20: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49  .          codeI
eb30: 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e  nteger(v, z, p->
eb40: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+1);.        }.
eb50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eb60: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  free(z);.       
eb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
eb80: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
eb90: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
eba0: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
ebb0: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
ebc0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
ebd0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ebe0: 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
ebf0: 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
ec00: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
ec10: 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71  _Not );.      sq
ec20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ec30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ec40: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
ec50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
ec60: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
ec70: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
ec80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ec90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
eca0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
ecb0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
ecc0: 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20     int dest;.   
ecd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
ece0: 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
ecf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ed00: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
ed10: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
ed20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed30: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ed40: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
ed50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ed60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ed70: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
ed80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ed90: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
eda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
edb0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
edc0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
edd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ede0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
edf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
ee00: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
ee10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ee20: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
ee30: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
ee40: 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
ee50: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
ee60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
ee70: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
ee80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ee90: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
eea0: 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54  of aggregate: %T
eeb0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ",.            &
eec0: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
eed0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eef0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
ef00: 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  d, pInfo->aFunc[
ef10: 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
ef20: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
ef30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
ef50: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
ef60: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
ef70: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
ef80: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
ef90: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
efa0: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
efb0: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
efc0: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
efd0: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
efe0: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
eff0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
f000: 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
f010: 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
f020: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
f030: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
f040: 3e 64 62 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  >db;.      u8 en
f050: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
f060: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
f070: 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 7a 49  l = 0;..      zI
f080: 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  d = (char*)pExpr
f090: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
f0a0: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
f0b0: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
f0c0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
f0d0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
f0e0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
f0f0: 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
f100: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
f110: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  !=0 );.      nEx
f120: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
f130: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
f140: 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 23 69 66  rse, pList);.#if
f150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f170: 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
f180: 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
f190: 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
f1a0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
f1b0: 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
f1c0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
f1d0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
f1e0: 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
f1f0: 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
f200: 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
f210: 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
f220: 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
f230: 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
f240: 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
f250: 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
f260: 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
f270: 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
f280: 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
f290: 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
f2a0: 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
f2b0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
f2c0: 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
f2d0: 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
f2e0: 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
f2f0: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
f300: 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
f310: 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
f320: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
f330: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
f340: 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
f350: 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
f360: 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
f370: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
f380: 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
f390: 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
f3a0: 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
f3b0: 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
f3c0: 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
f3d0: 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
f3e0: 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
f3f0: 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
f400: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
f410: 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28 70  ( nExpr>=2 && (p
f420: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
f430: 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
f440: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
f450: 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
f460: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
f470: 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74  ef, nExpr, pList
f480: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
f490: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f4a0: 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20  Expr>0 ){.      
f4b0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
f4c0: 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
f4d0: 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
f4e0: 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30  Expr, pList->a[0
f4f0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f500: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  }.#endif.      f
f510: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
f520: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
f530: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f540: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
f550: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
f560: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
f570: 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31   constMask |= (1
f580: 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
f590: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
f5a0: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
f5b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
f5c0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
f5d0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
f5e0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
f5f0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
f600: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f610: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
f620: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
f630: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
f640: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
f650: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
f660: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
f670: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
f680: 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
f690: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
f6a0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
f6b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
f6c0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  dbeOp3(v, OP_Fun
f6d0: 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b  ction, constMask
f6e0: 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29  , nExpr, (char*)
f6f0: 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46  pDef, P3_FUNCDEF
f700: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
f710: 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20  ng = 1-nExpr;.  
f720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f730: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f740: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
f750: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
f760: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
f770: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  LECT: {.      if
f780: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
f790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
f7a0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
f7b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
f7c0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f7d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7e0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
f7f0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
f800: 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 0);.      Vdbe
f810: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c  Comment((v, "# l
f820: 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65 73  oad subquery res
f830: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72  ult"));.      br
f840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f850: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
f860: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
f870: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
f880: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6b 4f 66  ;.      int ckOf
f890: 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63  fset = pParse->c
f8a0: 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 73  kOffset;.      s
f8b0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
f8c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
f8d0: 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69  r);..      /* Fi
f8e0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66  gure out the aff
f8f0: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20  inity to use to 
f900: 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f  create a key fro
f910: 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  m the results.  
f920: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78      ** of the ex
f930: 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69  pression. affini
f940: 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73  tyStr stores a s
f950: 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69  tatic string sui
f960: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20  table for.      
f970: 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65  ** P3 of OP_Make
f980: 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f  Record..      */
f990: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
f9a0: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
f9b0: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20  nity(pExpr);..  
f9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f9d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
f9e0: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
f9f0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
fa00: 74 20 3d 20 28 63 6b 4f 66 66 73 65 74 20 3f 20  t = (ckOffset ? 
fa10: 28 63 6b 4f 66 66 73 65 74 2b 31 29 20 3a 20 30  (ckOffset+1) : 0
fa20: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
fa30: 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  e the <expr> fro
fa40: 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
fa50: 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  .)". The tempora
fa60: 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
fa70: 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
fa80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
fa90: 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
faa0: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a   the (...) set..
fab0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
fac0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
fad0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fae0: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
faf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
fb00: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
fb10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
fb30: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b  ll, -1, addr+4);
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
fb50: 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20  ddr + 0 */.     
fb60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb70: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20  p(v, OP_Pop, 2, 
fb80: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
fb90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fba0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
fbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fbc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
fbd0: 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20   0, addr+7);.   
fbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
fbf0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
fc00: 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e  rd, 1, 0, &affin
fc10: 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64  ity, 1);   /* ad
fc20: 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20  dr + 4 */.      
fc30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc40: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
fc50: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
fc60: 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+7);.      sqli
fc70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fc80: 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30  OP_AddImm, -1, 0
fc90: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
fca0: 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20      /* addr + 6 
fcb0: 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  */..      break;
fcc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
fcd0: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
fce0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
fcf0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
fd00: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
fd10: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
fd20: 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
fd30: 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  r->pList->a;.   
fd40: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
fd50: 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
fd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fd70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fd80: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
fd90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fda0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
fdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fdc0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
fdd0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
fde0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
fdf0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
fe00: 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Ge, 0, 0);.  
fe10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe20: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
fe30: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c   1, 0);.      pL
fe40: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
fe50: 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
fe60: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
fe70: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fe80: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
fe90: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
fea0: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
feb0: 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20  ight, OP_Le, 0, 
fec0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
fed0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fee0: 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _And, 0, 0);.   
fef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ff00: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55      case TK_UPLU
ff10: 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
ff20: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ff30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ff40: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
ff50: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
ff60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ff70: 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20  se TK_CASE: {.  
ff80: 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64      int expr_end
ff90: 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e  _label;.      in
ffa0: 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20  t jumpInst;.    
ffb0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20    int nExpr;.   
ffc0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ffd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ffe0: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
fff0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c  xprList_item *aL
10000 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20  istelem;..      
10010 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
10020 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ist);.      asse
10030 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt((pExpr->pList
10040 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20  ->nExpr % 2) == 
10050 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
10060 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
10070 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
10080 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
10090 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c  >pList;.      aL
100a0 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74  istelem = pEList
100b0 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  ->a;.      nExpr
100c0 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
100d0 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64  ;.      expr_end
100e0 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  _label = sqlite3
100f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10100 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
10110 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
10120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10130 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10140 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
10150 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
10160 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32  ; i<nExpr; i=i+2
10170 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10180 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10190 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e  e, aListelem[i].
101a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
101b0 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
101c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
101d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
101e0 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b  , OP_Dup, 1, 1);
101f0 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
10200 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  nst = codeCompar
10210 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10220 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65  >pLeft, aListele
10230 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20  m[i].pExpr,.    
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
10260 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  Ne, 0, 1);.     
10270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10280 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
10290 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
102a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
102b0 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69   jumpInst = sqli
102c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
102d0 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b  OP_IfNot, 1, 0);
102e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
102f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10300 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
10310 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29  elem[i+1].pExpr)
10320 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10330 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10340 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65  _Goto, 0, expr_e
10350 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
10360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10370 6d 70 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e  mpHere(v, jumpIn
10380 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
10390 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
103a0 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
103b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
103c0 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
103d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
103e0 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
103f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
10400 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10410 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
10420 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
10430 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10440 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10450 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
10460 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10470 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10480 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f  bel(v, expr_end_
10490 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  label);.      br
104a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
104b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
104c0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
104d0 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
104e0 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
104f0 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
10500 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10510 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
10540 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
10550 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
10560 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
10570 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
10580 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
10590 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
105a0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
105b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
105c0 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
105d0 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
105e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
105f0 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
10600 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
10610 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
10620 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
10630 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
10640 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
10650 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
10660 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  pr);.         sq
10670 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10680 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
10690 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
106a0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72      (char*)pExpr
106d0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
106e0 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
106f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10700 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
10710 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
10720 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
10730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10740 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
10750 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
10760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10770 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
10780 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
10790 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
107a0 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
107b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
107c0 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
107d0 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
107e0 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
107f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10800 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
10810 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
10820 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  kOffset ){.    p
10830 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
10840 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20  += stackChng;.  
10850 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
10860 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20  ->ckOffset );.  
10870 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
10880 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
10890 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
108a0 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74  code that evalut
108b0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
108c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
108d0 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
108e0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
108f0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
10900 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a  ExprCode()..**.*
10910 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
10920 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20  ight also cache 
10930 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d  the result and m
10940 6f 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20  odify the pExpr 
10950 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  tree.** so that 
10960 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65  it will make use
10970 20 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72   of the cached r
10980 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
10990 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a  ent evaluations.
109a0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  ** rather than e
109b0 76 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c  valuate the whol
109c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
109d0 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70  in.  Trivial exp
109e0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
109f0 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20  not cached.  If 
10a00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10a10 73 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65  s cached, its re
10a20 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69  sult is stored i
10a30 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c  n a .** memory l
10a40 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ocation..*/.void
10a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10a60 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
10a70 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
10a80 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
10a90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10aa0 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69  .  int iMem;.  i
10ab0 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
10ac0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
10ad0 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20  turn;.  addr1 = 
10ae0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10af0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c  ntAddr(v);.  sql
10b00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10b10 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61  rse, pExpr);.  a
10b20 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
10b30 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10b40 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64  ;.  if( addr2>ad
10b50 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33  dr1+1 || sqlite3
10b60 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
10b70 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  r1)->opcode==OP_
10b80 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  Function ){.    
10b90 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  iMem = pExpr->iT
10ba0 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
10bb0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
10bc0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10bd0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
10be0 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  , 0);.    pExpr-
10bf0 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
10c00 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  R;.  }.}.#endif.
10c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10c20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
10c30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
10c40 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
10c50 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
10c60 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f  ession list onto
10c70 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
10c80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10c90 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
10ca0 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
10cb0 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stack..*/.int sq
10cc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
10cd0 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
10ce0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
10cf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10d00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
10d10 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ist    /* The ex
10d20 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
10d30 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a   be coded */.){.
10d40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10d50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
10d60 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28   int i, n;.  if(
10d70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
10d80 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rn 0;.  n = pLis
10d90 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
10da0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
10db0 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  i=n; i>0; i--, p
10dc0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
10dd0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10de0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
10df0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
10e00 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
10e10 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
10e20 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
10e30 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
10e40 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
10e50 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
10e60 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
10e70 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
10e80 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
10e90 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
10ea0 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
10eb0 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
10ec0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10ed0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
10ee0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
10ef0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
10f00 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
10f10 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
10f20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
10f30 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
10f40 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
10f50 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
10f60 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
10f70 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
10f80 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
10f90 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
10fa0 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
10fb0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
10fc0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
10fd0 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
10fe0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
10ff0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
11000 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
11010 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
11020 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
11030 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
11040 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
11050 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
11060 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
11070 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
11080 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
11090 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
110a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
110b0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
110c0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
110d0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
110e0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
110f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
11100 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
11110 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63   op = 0;.  int c
11120 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65  kOffset = pParse
11130 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66  ->ckOffset;.  if
11140 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
11150 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
11160 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
11170 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
11180 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
11190 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
111a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
111b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
111c0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
111d0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
111e0 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
111f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
11200 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
11210 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
11220 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
11230 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
11240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11250 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
11260 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11270 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11280 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
11290 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
112a0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
112b0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
112c0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
112d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
112e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
112f0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
11300 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
11310 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11320 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
11330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11340 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
11350 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11360 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
11370 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11380 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
11390 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
113a0 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
113b0 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
113c0 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
113d0 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
113e0 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
113f0 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
11400 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
11410 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
11420 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11430 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
11440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11450 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
11460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11470 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
11480 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
11490 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
114a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
114b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
114c0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
114d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
114e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
114f0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
11500 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
11510 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
11520 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
11530 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11540 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11560 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
11570 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
11580 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11590 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
115a0 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
115b0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
115c0 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
115d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
115e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
115f0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
11600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11610 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
11620 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
11630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11640 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
11650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
11660 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
11670 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
11680 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
11690 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
116a0 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
116b0 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
116c0 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
116d0 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
116e0 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
116f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
11700 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
11710 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
11720 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
11730 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
11740 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
11750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11760 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11770 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
11780 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11790 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
117a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
117b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
117c0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
117d0 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
117e0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
117f0 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
11800 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
11810 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
11820 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
11830 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
11840 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
11850 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
11860 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11870 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11880 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
11890 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
118a0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
118b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
118c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
118d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
118e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
118f0 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
11900 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11910 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
11920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11930 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11940 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11950 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
11960 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
11970 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11980 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
11990 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
119a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
119b0 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
119c0 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
119d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
119e0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
119f0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
11a00 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
11a10 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
11a20 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
11a30 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
11a40 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
11a50 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
11a60 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
11a70 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
11a80 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
11a90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
11aa0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
11ab0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
11ac0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
11ad0 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
11ae0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
11af0 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
11b00 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
11b10 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
11b20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
11b30 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
11b40 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
11b50 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
11b60 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
11b70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
11b80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11b90 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b  op = 0;.  int ck
11ba0 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
11bb0 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  >ckOffset;.  if(
11bc0 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
11bd0 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
11be0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * The value of p
11bf0 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20  Expr->op and op 
11c00 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20 66  are related as f
11c10 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
11c20 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  *       pExpr->o
11c30 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a  p            op.
11c40 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d    **       -----
11c50 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d  ----          --
11c60 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20  --------.  **   
11c70 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20      TK_ISNULL   
11c80 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c         OP_NotNul
11c90 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
11ca0 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  NOTNULL         
11cb0 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20  OP_IsNull.  **  
11cc0 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20       TK_NE      
11cd0 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20          OP_Eq.  
11ce0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20  **       TK_EQ  
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
11d00 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
11d10 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GT              
11d20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Le.  **      
11d30 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20   TK_LE          
11d40 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20      OP_Gt.  **  
11d50 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20       TK_GE      
11d60 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20          OP_Lt.  
11d70 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20  **       TK_LT  
11d80 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
11d90 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  e.  **.  ** For 
11da0 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  other values of 
11db0 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73  pExpr->op, op is
11dc0 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75   undefined and u
11dd0 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20  nused..  ** The 
11de0 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64  value of TK_ and
11df0 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61   OP_ constants a
11e00 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63 68  re arranged such
11e10 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61   that we.  ** ca
11e20 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61  n compute the ma
11e30 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e  pping above usin
11e40 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
11e50 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a  expression..  **
11e60 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69 66   Assert()s verif
11e70 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75  y that the compu
11e80 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63  tation is correc
11e90 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28  t..  */.  op = (
11ea0 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49  (pExpr->op+(TK_I
11eb0 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b  SNULL&1))^1)-(TK
11ec0 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f  _ISNULL&1);..  /
11ed0 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63 74  * Verify correct
11ee0 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b   alignment of TK
11ef0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
11f00 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
11f10 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11f20 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  _ISNULL || op==O
11f30 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61  P_NotNull );.  a
11f40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
11f50 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20  !=TK_NOTNULL || 
11f60 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  op==OP_IsNull );
11f70 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
11f80 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f  ->op!=TK_NE || o
11f90 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73  p==OP_Eq );.  as
11fa0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
11fb0 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_EQ || op==OP
11fc0 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ne );.  assert(
11fd0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
11fe0 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29  T || op==OP_Ge )
11ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
12000 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  r->op!=TK_LE || 
12010 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61  op==OP_Gt );.  a
12020 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
12030 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GT || op==O
12040 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Le );.  assert
12050 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
12060 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20  GE || op==OP_Lt 
12070 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  );..  switch( pE
12080 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
12090 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
120a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
120b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
120c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
120d0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
120e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
120f0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
12100 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
12110 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
12120 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12130 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12140 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
12150 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
12160 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12170 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12180 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
12190 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
121a0 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
121b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
121c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
121d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
121e0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
121f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12200 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12210 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
12220 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12230 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
12240 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12250 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
12260 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
12270 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
12280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12290 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
122a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
122b0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
122c0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
122d0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
122e0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
122f0 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
12300 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12310 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
12320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
12330 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12340 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
12350 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12360 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12370 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
12380 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
12390 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
123a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
123b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
123c0 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
123d0 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
123e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
123f0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12400 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
12410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12420 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
12430 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12440 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
12450 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
12460 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
12470 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
12480 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
12490 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
124a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
124b0 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
124c0 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
124d0 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
124e0 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
124f0 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
12500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12510 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
12520 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
12530 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
12540 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
12550 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
12560 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
12570 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12580 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
12590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
125a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
125b0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
125c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
125d0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
125e0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
125f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12600 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63  Addr(v);.      c
12610 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
12620 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
12630 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c  , OP_Ge, addr+3,
12640 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
12650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12660 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
12670 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
12680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12690 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
126a0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67  est);.      pRig
126b0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
126c0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
126d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
126e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
126f0 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
12700 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
12710 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
12720 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Gt, dest, jump
12730 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
12740 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12750 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
12760 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12770 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
12780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12790 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
127a0 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
127b0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
127c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
127d0 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
127e0 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a  t = ckOffset;.}.
127f0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70  ./*.** Do a deep
12800 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
12810 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  wo expression tr
12820 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ees.  Return TRU
12830 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20  E (non-zero).** 
12840 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
12850 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e  tical and return
12860 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64   FALSE if they d
12870 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
12880 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ..**.** Sometime
12890 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
128a0 69 6c 6c 20 72 65 74 75 72 6e 20 46 41 4c 53 45  ill return FALSE
128b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 74 77 6f   even if the two
128c0 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
128d0 72 65 61 6c 6c 79 20 61 72 65 20 65 71 75 69 76  really are equiv
128e0 61 6c 65 6e 74 2e 20 20 49 66 20 77 65 20 63 61  alent.  If we ca
128f0 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
12900 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
12910 61 72 65 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  are.** identical
12920 2c 20 77 65 20 72 65 74 75 72 6e 20 46 41 4c 53  , we return FALS
12930 45 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  E just to be saf
12940 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
12950 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
12960 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f  s false, then yo
12970 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
12980 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
12990 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
129a0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
129b0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
129c0 20 79 6f 75 20 67 65 74 20 61 20 54 52 55 45 20   you get a TRUE 
129d0 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
129e0 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
129f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
12a00 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
12a10 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
12a20 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
12a30 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
12a40 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
12a50 67 65 74 20 61 6e 20 65 78 74 72 61 20 46 41 4c  get an extra FAL
12a60 53 45 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73  SE - that.** jus
12a70 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
12a80 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
12a90 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
12aa0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
12ab0 6e 20 69 6e 63 6f 72 72 65 63 74 20 54 52 55 45  n incorrect TRUE
12ac0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
12ad0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
12ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
12af0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
12b00 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
12b10 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
12b20 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
12b30 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
12b40 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
12b50 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
12b60 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
12b70 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
12b80 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
12b90 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
12ba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12bb0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
12bc0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
12bd0 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
12be0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
12bf0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
12c00 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
12c10 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
12c20 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
12c30 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
12c40 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
12c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
12c60 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
12c70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
12c80 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
12c90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12ca0 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
12cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
12cc0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
12cd0 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
12ce0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
12cf0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
12d00 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
12d10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
12d20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
12d30 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
12d40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12d50 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
12d60 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
12d70 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
12d80 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
12d90 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
12da0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
12db0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
12dc0 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21  0;.  if( pA->op!
12dd0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
12de0 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
12df0 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
12e00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12e10 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
12e20 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
12e30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
12e40 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
12e50 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41 2d 3e  ICmp((char*)pA->
12e60 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70  token.z,(char*)p
12e70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74  B->token.z,pB->t
12e80 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20  oken.n)!=0 ){.  
12e90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12ea0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12eb0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   1;.}.../*.** Ad
12ec0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
12ed0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
12ee0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
12ef0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
12f00 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
12f10 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
12f20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
12f30 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
12f40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
12f50 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
12f60 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
12f70 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
12f80 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
12f90 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
12fa0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
12fb0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
12fc0 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
12fd0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
12fe0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
12ff0 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
13000 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
13010 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
13020 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
13030 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
13040 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
13050 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
13060 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
13070 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
13080 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
13090 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
130a0 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
130b0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
130c0 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
130d0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
130e0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
130f0 66 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a  foFunc(sqlite3 *
13100 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
13110 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
13120 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73  pInfo->aFunc = s
13130 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
13140 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20  ate(.       db, 
13150 0a 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  .       pInfo->a
13160 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a  Func,.       siz
13170 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  eof(pInfo->aFunc
13180 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a  [0]),.       3,.
13190 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
131a0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 70 49  Func,.       &pI
131b0 6e 66 6f 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c  nfo->nFuncAlloc,
131c0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
131d0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
131e0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
131f0 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
13200 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65  lkExprTree() use
13210 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a  d to implement .
13220 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ** sqlite3ExprAn
13230 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
13240 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
13250 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
13260 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
13270 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13280 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
13290 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
132a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
132b0 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e  nction at pExpr.
132c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
132d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
132e0 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72  void *pArg, Expr
132f0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
13300 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
13310 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
13320 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50  text *)pArg;.  P
13330 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
13340 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
13350 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
13360 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
13370 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
13380 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
13390 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28  Info;..  switch(
133a0 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
133b0 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
133c0 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
133d0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
133e0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
133f0 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
13400 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
13410 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
13420 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
13430 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
13440 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
13450 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74      if( pSrcList
13460 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
13470 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13480 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73  *pItem = pSrcLis
13490 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f  t->a;.        fo
134a0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
134b0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
134c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
134d0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
134e0 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20  _col *pCol;.    
134f0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
13500 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
13510 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
13520 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
13530 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
13540 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
13550 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
13560 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
13570 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
13580 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
13590 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
135a0 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
135b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
135c0 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
135d0 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
135e0 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
135f0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
13600 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
13610 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
13620 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
13630 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
13640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
13650 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
13660 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
13670 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
13680 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
13690 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
136a0 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
136c0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
136d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
13700 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
13710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13720 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13750 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
13760 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
13770 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
13780 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
13790 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
137a0 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
137b0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
137d0 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
137e0 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
137f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
13800 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
13820 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
13830 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
13840 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13850 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
13860 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
13870 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
13880 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
13890 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
138a0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
138b0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
138c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
138d0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
138f0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
13900 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
13910 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
13920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13930 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
13940 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
13950 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
13960 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
13970 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
13980 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
13990 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
139a0 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
139b0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
139c0 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
139d0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
139e0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
139f0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
13a00 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
13a10 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
13a20 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
13a30 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
13a40 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
13a70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
13a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a90 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
13aa0 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13ad0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
13b10 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
13b20 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
13b30 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
13b40 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
13b50 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
13b60 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
13b70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13b90 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
13ba0 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
13bb0 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
13bc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
13bd0 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
13be0 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
13bf0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
13c00 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
13c10 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
13c20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
13c30 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
13c40 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
13c50 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
13c60 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
13c70 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
13c80 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
13c90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
13ca0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
13cb0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
13cc0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
13cd0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
13ce0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
13cf0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
13d00 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20  >iAgg = k;.     
13d10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13d20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
13d30 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
13d40 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
13d50 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
13d60 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
13d70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
13d80 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
13d90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
13da0 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
13db0 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
13dc0 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  e pNC->nDepth==0
13dd0 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67   test causes agg
13de0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
13df0 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20   in subqueries. 
13e00 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67       ** to be ig
13e10 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  nored */.      i
13e20 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
13e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13e40 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
13e50 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
13e60 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
13e70 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
13e80 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
13e90 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
13ea0 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
13eb0 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
13ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
13ed0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
13ee0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
13ef0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
13f00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
13f10 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
13f20 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
13f30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
13f40 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
13f50 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
13f60 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
13f70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13f90 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
13fa0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
13fb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
13fc0 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
13fd0 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
13fe0 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
13ff0 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
14000 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
14010 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
14020 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
14030 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
14040 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
14050 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
14060 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
14070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14080 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
14090 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
140a0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
140b0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
140c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
140d0 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
140e0 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
140f0 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
14100 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
14110 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
14120 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
14130 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
14140 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
14150 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
14180 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
14190 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
141a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
141b0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
141c0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
141e0 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
141f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14200 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
14210 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
14220 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
14230 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14250 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14260 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
14270 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
14280 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
14290 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
142a0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
142b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
142c0 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  g = i;.        p
142d0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
142e0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
142f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14310 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
14320 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73   walk subqueries
14330 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f   looking for TK_
14340 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61  COLUMN nodes tha
14350 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62  t need.  ** to b
14360 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  e changed to TK_
14370 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74  AGG_COLUMN.  But
14380 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74   increment nDept
14390 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54  h so that.  ** T
143a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
143b0 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69  odes in subqueri
143c0 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61  es will be uncha
143d0 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
143e0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
143f0 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
14400 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65  th++;.    walkSe
14410 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e  lectExpr(pExpr->
14420 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65  pSelect, analyze
14430 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
14440 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
14450 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
14460 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
14470 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
14480 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
14490 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
144a0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
144b0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
144c0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
144d0 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
144e0 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
144f0 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
14500 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
14510 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
14520 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
14530 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
14540 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
14550 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
14560 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
14570 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
14580 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
14590 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
145a0 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ames()..**.** If
145b0 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
145c0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
145d0 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
145e0 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
145f0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
14600 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
14610 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
14620 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
14630 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
14640 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
14650 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50  t nErr = pNC->pP
14660 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61  arse->nErr;.  wa
14670 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
14680 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
14690 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75  te, pNC);.  retu
146a0 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  rn pNC->pParse->
146b0 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a  nErr - nErr;.}..
146c0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
146d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
146e0 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
146f0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
14700 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
14710 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
14720 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
14730 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
14740 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
14750 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
14760 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
14770 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
14780 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
14790 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
147a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
147b0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
147c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
147d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
147e0 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28   nErr = 0;.  if(
147f0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
14800 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
14810 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  , i=0; nErr==0 &
14820 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
14830 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
14840 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73  .      nErr += s
14850 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
14860 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
14870 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
14880 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14890 72 6e 20 6e 45 72 72 3b 0a 7d 0a                 rn nErr;.}.