/ Hex Artifact Content
Login

Artifact 70660e0c5fc6375a03b3a7fc4eb6e66d96e5f6b1:


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 39 20 32 30 30 37 2f 30 38 2f 32 39 20  .309 2007/08/29 
0220: 31 32 3a 33 31 3a 32 36 20 64 61 6e 69 65 6c 6b  12:31:26 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: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b10: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1b20: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
1b30: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
1b40: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
1b50: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
1b60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
1b70: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
1b80: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
1b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
1ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
1bb0: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1bc0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6f        /* Right o
1bd0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1be0: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  t Token *pToken 
1bf0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
1c00: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  token */.){.  Ex
1c10: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1c20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1c30: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1c40: 66 28 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  f(Expr));.  if( 
1c50: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
1c60: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1c70: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
1c80: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
1c90: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
1ca0: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
1cb0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
1cc0: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
1cd0: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
1ce0: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
1cf0: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
1d00: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  e3ExprDelete(pLe
1d20: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1d30: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
1d40: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1d50: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
1d60: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
1d70: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
1d80: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
1d90: 52 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69  Right;.  pNew->i
1da0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Agg = -1;.  if( 
1db0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
1dc0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
1dd0: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
1de0: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
1df0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
1e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1e10: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 69  t ){.    if( pRi
1e20: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
1e30: 69 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65  ite3ExprSpan(pNe
1e40: 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c  w, &pLeft->span,
1e50: 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b   &pRight->span);
1e60: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
1e70: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
1e80: 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
1e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1ea0: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
1eb0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ec0: 70 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e  pColl = pRight->
1ed0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pColl;.      }. 
1ee0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
1ef0: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
1f00: 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
1f10: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1f20: 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  = EP_ExpCollate;
1f30: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f  .      pNew->pCo
1f40: 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c  ll = pLeft->pCol
1f50: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  l;.    }.  }..  
1f60: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
1f70: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
1f80: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
1f90: 0a 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  .** Works like s
1fa0: 71 6c 69 74 65 33 45 78 70 72 28 29 20 65 78 63  qlite3Expr() exc
1fb0: 65 70 74 20 74 68 61 74 20 69 74 20 74 61 6b 65  ept that it take
1fc0: 73 20 61 6e 20 65 78 74 72 61 20 50 61 72 73 65  s an extra Parse
1fd0: 2a 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e  *.** argument an
1fe0: 64 20 6e 6f 74 69 66 69 65 73 20 74 68 65 20 61  d notifies the a
1ff0: 73 73 6f 63 69 61 74 65 64 20 63 6f 6e 6e 65 63  ssociated connec
2000: 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d  tion object if m
2010: 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
2020: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78  Expr *sqlite3PEx
2030: 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
2040: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
2050: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
2060: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2080: 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f   Expression opco
2090: 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  de */.  Expr *pL
20a0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
20b0: 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20  /* Left operand 
20c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
20d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
20e0: 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  Right operand */
20f0: 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  .  const Token *
2100: 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72  pToken     /* Ar
2110: 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  gument token */.
2120: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2130: 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e  te3Expr(pParse->
2140: 64 62 2c 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70  db, op, pLeft, p
2150: 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a  Right, pToken);.
2160: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f  }../*.** When do
2170: 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72  ing a nested par
2180: 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c  se, you can incl
2190: 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ude terms in an 
21a0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68  expression.** th
21b0: 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69  at look like thi
21c0: 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e  s:   #0 #1 #2 ..
21d0: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72  .  These terms r
21e0: 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73  efer to elements
21f0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
2200: 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68  .  "#0" means th
2210: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
2220: 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e  ck..** "#1" mean
2230: 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20  s the next down 
2240: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41  on the stack.  A
2250: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a  nd so forth..**.
2260: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2270: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2280: 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20   parser to deal 
2290: 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65  with on of those
22a0: 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d   terms..** It im
22b0: 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61  mediately genera
22c0: 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72  tes code to stor
22d0: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61  e the value in a
22e0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
22f0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73  ..** The returns
2300: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2310: 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f  hat will code to
2320: 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
2330: 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20  ue from.** that 
2340: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2350: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78  as needed..*/.Ex
2360: 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73  pr *sqlite3Regis
2370: 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a 70  terExpr(Parse *p
2380: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
2390: 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76  oken){.  Vdbe *v
23a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
23b0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  ;.  Expr *p;.  i
23c0: 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20  nt depth;.  if( 
23d0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
23e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2400: 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73   "near \"%T\": s
2410: 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54  yntax error", pT
2420: 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  oken);.    retur
2430: 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  n sqlite3PExpr(p
2440: 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20  Parse, TK_NULL, 
2450: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
2460: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
2470: 6e 20 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  n 0;.  p = sqlit
2480: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2490: 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20  TK_REGISTER, 0, 
24a0: 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  0, pToken);.  if
24b0: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ( p==0 ){.    re
24c0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 0;  /* Mall
24d0: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
24e0: 0a 20 20 64 65 70 74 68 20 3d 20 61 74 6f 69 28  .  depth = atoi(
24f0: 28 63 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e  (char*)&pToken->
2500: 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62  z[1]);.  p->iTab
2510: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  le = pParse->nMe
2520: 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  m++;.  sqlite3Vd
2530: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
2540: 70 2c 20 64 65 70 74 68 2c 20 30 29 3b 0a 20 20  p, depth, 0);.  
2550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2560: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
2570: 20 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a   p->iTable, 1);.
2580: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2590: 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78  *.** Join two ex
25a0: 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20  pressions using 
25b0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
25c0: 20 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72    If either expr
25d0: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c  ession is.** NUL
25e0: 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  L, then just ret
25f0: 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78  urn the other ex
2600: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70  pression..*/.Exp
2610: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
2620: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
2630: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
2640: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
2650: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
2660: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
2670: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2680: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
2690: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
26a0: 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  se{.    Expr *p 
26b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
26c0: 2c 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  , TK_AND, pLeft,
26d0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
26e0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
26f0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
2700: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
2710: 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d     return p;.  }
2720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2730: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
2740: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
2750: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
2760: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
2770: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
2780: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
2790: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
27a0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
27b0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
27c0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
27d0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
27e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27f0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2800: 28 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68  ( pExpr && pRigh
2810: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
2820: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2830: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
2840: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
2850: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
2860: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2870: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2880: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2890: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
28a0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
28b0: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
28c0: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
28d0: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
28e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
2900: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
2910: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
2920: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2930: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
2940: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
2950: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
2960: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
2970: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61  3ExprFunction(Pa
2980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2990: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
29a0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
29b0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73  Expr *pNew;.  as
29c0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a  sert( pToken );.
29d0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
29e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
29f0: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2a00: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2a10: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2a20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2a30: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2a40: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2a50: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2a60: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2a70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2a80: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2a90: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
2aa0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
2ab0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
2ac0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
2ad0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
2ae0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
2af0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20  pNew->token;..  
2b00: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
2b10: 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65  ight(pNew);.  re
2b20: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2b30: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2b40: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2b50: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2b60: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2b70: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2b80: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2b90: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2ba0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2bb0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
2bc0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
2bd0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
2be0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
2bf0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2c00: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2c10: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2c20: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2c30: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2c40: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2c50: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2c60: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2c70: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2c80: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2c90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2ca0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2cb0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2cc0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2cd0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2ce0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2cf0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2d00: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2d10: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2d20: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2d30: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2d40: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2d50: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2d60: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2d70: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2d80: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2d90: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2da0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2db0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2dc0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2dd0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2de0: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2df0: 65 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  en;.  sqlite3 *d
2e00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2e10: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
2e20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
2e30: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
2e40: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
2e50: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
2e60: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2e70: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2e80: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2e90: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2ea0: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2eb0: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2ec0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2ed0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2ee0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2ef0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2f00: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2f10: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
2f20: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
2f30: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
2f40: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
2f50: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
2f60: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
2f70: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2f80: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2f90: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2fa0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2fb0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2fc0: 20 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a   i = atoi((char*
2fd0: 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  )&pToken->z[1]);
2fe0: 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20  .    if( i<1 || 
2ff0: 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  i>SQLITE_MAX_VAR
3000: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a  IABLE_NUMBER ){.
3010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3020: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
3030: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
3040: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
3050: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
3060: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
3070: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
3080: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3090: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
30a0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
30b0: 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d  >nVar = i;.    }
30c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30d0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
30e0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
30f0: 20 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20   "$aaa".  Reuse 
3100: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
3110: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
3120: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
3130: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
3140: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
3150: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
3160: 68 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72  has never appear
3170: 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65  ed before, reuse
3180: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
3190: 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f  le number.    */
31a0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  .    int i, n;. 
31b0: 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e     n = pToken->n
31c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
31d0: 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  <pParse->nVarExp
31e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
31f0: 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
3200: 66 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d  f( (pE = pParse-
3210: 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d  >apVarExpr[i])!=
3220: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
3230: 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20  E->token.n==n.  
3240: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
3250: 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pE->token.z, p
3260: 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20  Token->z, n)==0 
3270: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
3280: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69  ->iTable = pE->i
3290: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62  Table;.        b
32a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
32b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70    }.    if( i>=p
32c0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20  Parse->nVarExpr 
32d0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
32e0: 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73  iTable = ++pPars
32f0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69  e->nVar;.      i
3300: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  f( pParse->nVarE
3310: 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61  xpr>=pParse->nVa
3320: 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a  rExprAlloc-1 ){.
3330: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3340: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d  nVarExprAlloc +=
3350: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
3360: 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20  rAlloc + 10;.   
3370: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
3380: 61 72 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  arExpr =.       
3390: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
33a0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a 20 20 20  allocOrFree(.   
33b0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2c 0a 20             db,. 
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
33d0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
33f0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
3400: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  loc*sizeof(pPars
3410: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29  e->apVarExpr[0])
3420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
3430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3440: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
3450: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
3460: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
3470: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
3480: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
3490: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
34a0: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
34b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
34c0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
34d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
34e0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 53 51 4c  pParse->nVar>SQL
34f0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
3500: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 73  _NUMBER ){.    s
3510: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3520: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
3530: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
3540: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3550: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3560: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3570: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3580: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3590: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
35a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
35b0: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
35c0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
35d0: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
35e0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
35f0: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f  n.dyn ) sqlite3_
3600: 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  free((char*)p->t
3610: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74  oken.z);.  sqlit
3620: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3630: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
3640: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
3650: 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65  Right);.  sqlite
3660: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3670: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  p->pList);.  sql
3680: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3690: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
36a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
36b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
36c0: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
36d0: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
36e0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
36f0: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
3700: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
3710: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
3720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3730: 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74 65  quoteExpr(sqlite
3740: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29 7b  3 *db, Expr *p){
3750: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e  .  if( ExprHasAn
3760: 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  yProperty(p, EP_
3770: 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  Dequoted) ){.   
3780: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45   return;.  }.  E
3790: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
37a0: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a  , EP_Dequoted);.
37b0: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64    if( p->token.d
37c0: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  yn==0 ){.    sql
37d0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
37e0: 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d  , &p->token, &p-
37f0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73  >token);.  }.  s
3800: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63  qlite3Dequote((c
3810: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
3820: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
3830: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
3840: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
3850: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
3860: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
3870: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
3880: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
3890: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
38a0: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
38b0: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
38c0: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
38d0: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
38e0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
38f0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
3900: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
3910: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
3920: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
3930: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
3940: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
3950: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
3960: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
3970: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
3980: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
3990: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
39a0: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
39b0: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
39c0: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
39d0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
39e0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
39f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
3a00: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
3a10: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
3a20: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
3a30: 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  licated..*/.Expr
3a40: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70   *sqlite3ExprDup
3a50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3a60: 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  pr *p){.  Expr *
3a70: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
3a80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3a90: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3aa0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
3ab0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
3ac0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3ad0: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
3ae0: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
3af0: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
3b00: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
3b10: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
3b20: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44 62  = (u8*)sqlite3Db
3b30: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
3b40: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
3b50: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
3b60: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
3b70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3b80: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
3b90: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
3ba0: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
3bb0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
3bc0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
3bd0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66  rDup(db, p->pLef
3be0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
3bf0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3c00: 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  Dup(db, p->pRigh
3c10: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  t);.  pNew->pLis
3c20: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
3c30: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  istDup(db, p->pL
3c40: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
3c50: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3c60: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
3c70: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
3c80: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
3c90: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
3ca0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
3cb0: 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20  ken *pTo, Token 
3cc0: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
3cd0: 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65  To->dyn ) sqlite
3ce0: 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 54  3_free((char*)pT
3cf0: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3d00: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3d10: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
3d20: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38      pTo->z = (u8
3d30: 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  *)sqlite3DbStrND
3d40: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 46  up(db, (char*)pF
3d50: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
3d60: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
3d70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3d80: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
3d90: 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  }.}.ExprList *sq
3da0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3db0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
3dc0: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
3dd0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
3de0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
3df0: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
3e00: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
3e10: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3e20: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3e30: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3e40: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
3e50: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3e60: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3e70: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75 72  0;.  pNew->iECur
3e80: 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  sor = 0;.  pNew-
3e90: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
3ea0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
3eb0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
3ec0: 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tem = sqlite3DbM
3ed0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70 2d  allocRaw(db,  p-
3ee0: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
3ef0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3f00: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3f10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
3f20: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3f30: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
3f40: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
3f50: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
3f60: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
3f70: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
3f80: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
3f90: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
3fa0: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
3fb0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
3fc0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
3fd0: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
3fe0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
3ff0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
4000: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
4010: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
4020: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
4030: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
4040: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
4050: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
4060: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
4070: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
4080: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
4090: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
40a0: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
40b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
40c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
40d0: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
40e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
40f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
4100: 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e 65  kenCopy(db, &pNe
4110: 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f  wExpr->span, &pO
4120: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  ldExpr->span);. 
4130: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4140: 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20   pNewExpr==0 || 
4150: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pNewExpr->span.z
4160: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
4170: 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70   || pOldExpr->sp
4180: 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  an.z==0.        
4190: 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f      || db->mallo
41a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
41b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
41c0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
41d0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
41e0: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
41f0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
4200: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
4210: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67      pItem->isAgg
4220: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41   = pOldItem->isA
4230: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
4240: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
4250: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
4260: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
4270: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
4280: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
4290: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
42a0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
42b0: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
42c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
42d0: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
42e0: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
42f0: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
4300: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
4310: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
4320: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
4330: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
4340: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
4350: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4360: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
4370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4380: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
4390: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
43a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
43b0: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
43c0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
43d0: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
43e0: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
43f0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
4400: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
4410: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4420: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
4430: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
4440: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
4450: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
4460: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
4470: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
4480: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
4490: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
44a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
44b0: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
44c0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
44d0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
44e0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
44f0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
4500: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
4510: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
4520: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
4530: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
4540: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
4550: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
4560: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
4570: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
4580: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
4590: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61   pOldItem->zData
45a0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
45b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
45c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
45d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
45e0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
45f0: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
4600: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
4610: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
4620: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
4630: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
4640: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
4650: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
4660: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
4670: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
4680: 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  wItem->isPopulat
4690: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ed = pOldItem->i
46a0: 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20  sPopulated;.    
46b0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
46c0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
46d0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
46e0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
46f0: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
4700: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
4710: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
4720: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
4730: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
4740: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4750: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
4760: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  prDup(db, pOldIt
4770: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
4780: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
4790: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
47a0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
47b0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
47c0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
47d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
47e0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
47f0: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
4800: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
4810: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
4820: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
4830: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
4840: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
4850: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4860: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4870: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4880: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
4890: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
48a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
48b0: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
48c0: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
48d0: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
48e0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d  MallocRaw(db, p-
48f0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
4900: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
4910: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
4920: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
4930: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
4940: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4950: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
4960: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4970: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4980: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4990: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
49a0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
49b0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
49c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
49d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
49e0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
49f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
4a00: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
4a10: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
4a20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4a30: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
4a40: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
4a50: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
4a60: 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e  p){.  Select *pN
4a70: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
4a80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4a90: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
4aa0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
4ab0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
4ac0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4ad0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
4ae0: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
4af0: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
4b00: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
4b10: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
4b20: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4b30: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4b40: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
4b50: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
4b60: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
4b70: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
4b80: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
4b90: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
4ba0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4bb0: 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  db, p->pGroupBy)
4bc0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
4bd0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
4be0: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
4bf0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
4c00: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4c10: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
4c20: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
4c30: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
4c40: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
4c50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4c60: 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  p(db, p->pPrior)
4c70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
4c80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4c90: 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  p(db, p->pLimit)
4ca0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
4cb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
4cc0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
4cd0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
4ce0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
4cf0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
4d00: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
4d10: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4d20: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4d30: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4d40: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4d50: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4d60: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4d70: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4d80: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4d90: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
4da0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4db0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
4dc0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
4dd0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
4de0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
4df0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4e00: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4e10: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
4e20: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73  elect *p){.  ass
4e30: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
4e40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
4e50: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
4e60: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
4e70: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
4e80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
4e90: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
4ea0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
4eb0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
4ec0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4ed0: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
4ee0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
4ef0: 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  end(.  Parse *pP
4f00: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
4f10: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
4f20: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
4f30: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
4f40: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
4f50: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
4f60: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
4f70: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
4f80: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
4f90: 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ion to be append
4fa0: 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ed */.  Token *p
4fb0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
4fc0: 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66 6f  /* AS keyword fo
4fd0: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
4fe0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4ff0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5000: 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  b;.  if( pList==
5010: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
5020: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5030: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
5040: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
5050: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
5060: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
5070: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
5080: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
5090: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
50a0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
50b0: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
50c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
50d0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
50e0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
50f0: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
5100: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
5110: 5f 72 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  _realloc(pList->
5120: 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73  a, n*sizeof(pLis
5130: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
5140: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
5150: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
5160: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
5170: 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = a;.    pList-
5180: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d  >nAlloc = n;.  }
5190: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
51a0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
51b0: 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29  pExpr || pName )
51c0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
51d0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
51e0: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
51f0: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
5200: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
5210: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
5220: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
5230: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5240: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5250: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74   pName);.    pIt
5260: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
5270: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
5280: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
5290: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
52a0: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
52b0: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
52c0: 6c 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  led. */.  db->ma
52d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
52e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
52f0: 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71  ete(pExpr);.  sq
5300: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5310: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
5320: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5330: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
5340: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
5350: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
5360: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
5370: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
5380: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
5390: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
53a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
53b0: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
53c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
53d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
53e0: 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c 0a 20  .  int iLimit,. 
53f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
5400: 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20 70 45  ject.){.  if( pE
5410: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
5420: 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29 7b 0a  nExpr>iLimit ){.
5430: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5440: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
5450: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
5460: 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a   %s", zObject);.
5470: 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53 51 4c 49    }.}...#if SQLI
5480: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
5490: 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  H>0./* The follo
54a0: 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74  wing three funct
54b0: 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45 78  ions, heightOfEx
54c0: 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45 78  pr(), heightOfEx
54d0: 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20  prList().** and 
54e0: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 29  heightOfSelect()
54f0: 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 65  , are used to de
5500: 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78 69  termine the maxi
5510: 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66  mum height.** of
5520: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
5530: 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64 20  tree referenced 
5540: 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65  by the structure
5550: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
5560: 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * first argument
5570: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
5580: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 69  maximum height i
5590: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
55a0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
55b0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
55c0: 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65 20  y pnHeight, the 
55d0: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
55e0: 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48 65  , then set *pnHe
55f0: 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  ight to that.** 
5600: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
5610: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
5620: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
5630: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
5640: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
5650: 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65 69  ->nHeight>*pnHei
5660: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  ght ){.      *pn
5670: 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69  Height = p->nHei
5680: 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ght;.    }.  }.}
5690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
56a0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45 78  ghtOfExprList(Ex
56b0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a  prList *p, int *
56c0: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
56d0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
56e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
56f0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  p->nExpr; i++){.
5700: 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45 78        heightOfEx
5710: 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  pr(p->a[i].pExpr
5720: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5730: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
5740: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65 6c  void heightOfSel
5750: 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
5760: 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20  nt *pnHeight){. 
5770: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68 65   if( p ){.    he
5780: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 57  ightOfExpr(p->pW
5790: 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29 3b  here, pnHeight);
57a0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
57b0: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e  r(p->pHaving, pn
57c0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
57d0: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69  ghtOfExpr(p->pLi
57e0: 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  mit, pnHeight);.
57f0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
5800: 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48  (p->pOffset, pnH
5810: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
5820: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
5830: 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68 74  pEList, pnHeight
5840: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
5850: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
5860: 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  pBy, 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 4f 72 64 65 72 42 79  List(p->pOrderBy
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 53 65 6c 65 63 74 28   heightOfSelect(
58b0: 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65 69  p->pPrior, pnHei
58c0: 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
58d0: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
58e0: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
58f0: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
5900: 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 0a  e passed as an .
5910: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20  ** argument. An 
5920: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
5930: 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78 70  no children, Exp
5940: 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45  r.pList or .** E
5950: 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62  xpr.pSelect memb
5960: 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74 20  er has a height 
5970: 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72 20  of 1. Any other 
5980: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61  expression.** ha
5990: 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61 6c  s a height equal
59a0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
59b0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f 74  height of any ot
59c0: 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  her .** referenc
59d0: 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e 65  ed Expr plus one
59e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
59f0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 45  3ExprSetHeight(E
5a00: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  xpr *p){.  int n
5a10: 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68 65  Height = 0;.  he
5a20: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
5a30: 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  eft, &nHeight);.
5a40: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5a50: 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69 67  ->pRight, &nHeig
5a60: 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f 66 45  ht);.  heightOfE
5a70: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69 73 74  xprList(p->pList
5a80: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68  , &nHeight);.  h
5a90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
5aa0: 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67  >pSelect, &nHeig
5ab0: 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69 67 68  ht);.  p->nHeigh
5ac0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
5ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5ae0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
5af0: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
5b00: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
5b10: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
5b20: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
5b30: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
5b40: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
5b50: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
5b60: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
5b70: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
5b80: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
5b90: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
5ba0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
5bb0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a  eight;.}.#endif.
5bc0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
5bd0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
5be0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
5bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5c00: 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20  Delete(ExprList 
5c10: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
5c20: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
5c30: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
5c40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5c50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
5c60: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
5c70: 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  || (pList->nExpr
5c80: 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41  ==0 && pList->nA
5c90: 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73  lloc==0) );.  as
5ca0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
5cb0: 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  pr<=pList->nAllo
5cc0: 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  c );.  for(pItem
5cd0: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
5ce0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
5cf0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
5d00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5d10: 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  lete(pItem->pExp
5d20: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
5d30: 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  free(pItem->zNam
5d40: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
5d50: 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  3_free(pList->a)
5d60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
5d70: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
5d80: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
5d90: 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c  sion tree.  Call
5da0: 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20   xFunc for each 
5db0: 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a  node visited..**
5dc0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
5dd0: 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20  alue from xFunc 
5de0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
5df0: 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  er the tree walk
5e00: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30   continues..** 0
5e10: 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20   means continue 
5e20: 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65  walking the tree
5e30: 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f  .  1 means do no
5e40: 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a  t walk children.
5e50: 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ** of the curren
5e60: 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69  t node but conti
5e70: 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67  nue with sibling
5e80: 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e  s.  2 means aban
5e90: 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  don.** the tree 
5ea0: 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e  walk completely.
5eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
5ec0: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69  n value from thi
5ed0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74  s routine is 1 t
5ee0: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
5ef0: 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30  ee walk.** and 0
5f00: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
5f10: 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69  .** NOTICE:  Thi
5f20: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a  s routine does *
5f30: 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74  not* descend int
5f40: 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f  o subqueries..*/
5f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
5f60: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
5f70: 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69  t *, int (*)(voi
5f80: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
5f90: 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  d *);.static int
5fa0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78   walkExprTree(Ex
5fb0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28  pr *pExpr, int (
5fc0: 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78  *xFunc)(void*,Ex
5fd0: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
5fe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
5ff0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
6000: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28  turn 0;.  rc = (
6010: 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45  *xFunc)(pArg, pE
6020: 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  xpr);.  if( rc==
6030: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c  0 ){.    if( wal
6040: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
6050: 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70  >pLeft, xFunc, p
6060: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
6070: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
6080: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69  rTree(pExpr->pRi
6090: 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ght, xFunc, pArg
60a0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
60b0: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69    if( walkExprLi
60c0: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
60d0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
60e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
60f0: 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a  return rc>1;.}..
6100: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
6110: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
6120: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
6130: 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61  n list p..*/.sta
6140: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
6150: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
6160: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
6170: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
6180: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
6190: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
61a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
61b0: 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  em;.  if( !p ) r
61c0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
61d0: 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  =p->nExpr, pItem
61e0: 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  =p->a; i>0; i--,
61f0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
6200: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
6210: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46  pItem->pExpr, xF
6220: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
6230: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
6240: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6250: 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65  Call walkExprTre
6260: 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  e() for every ex
6270: 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65  pression in Sele
6280: 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64  ct p, not includ
6290: 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
62a0: 6e 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  ns that are part
62b0: 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20   of sub-selects 
62c0: 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75  in any FROM clau
62d0: 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a  se or the LIMIT.
62e0: 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70  ** or OFFSET exp
62f0: 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74  ressions...*/.st
6300: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c  atic int walkSel
6310: 65 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a  ectExpr(Select *
6320: 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  p, int (*xFunc)(
6330: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
6340: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
6350: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
6360: 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  EList, xFunc, pA
6370: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  rg);.  walkExprT
6380: 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78  ree(p->pWhere, x
6390: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
63a0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
63b0: 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20  GroupBy, xFunc, 
63c0: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
63d0: 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67  rTree(p->pHaving
63e0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
63f0: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
6400: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e  ->pOrderBy, xFun
6410: 63 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20  c, pArg);.  if( 
6420: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
6430: 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28   walkSelectExpr(
6440: 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46 75 6e 63  p->pPrior, xFunc
6450: 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72  , pArg);.  }.  r
6460: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
6470: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6480: 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61  is designed as a
6490: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
64a0: 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a  ExprTree()..**.*
64b0: 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79  * pArg is really
64c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
64d0: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65   integer.  If we
64e0: 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f   can tell by loo
64f0: 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72  king.** at pExpr
6500: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
6510: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
6520: 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  ns pExpr is not 
6530: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  a constant.** ex
6540: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73  pression, then s
6550: 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e  et *pArg to 0 an
6560: 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62  d return 2 to ab
6570: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
6580: 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72  alk..** If pExpr
6590: 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64   does does not d
65a0: 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78  isqualify the ex
65b0: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65  pression from be
65c0: 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  ing a constant.*
65d0: 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  * then do nothin
65e0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77  g..**.** After w
65f0: 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65  alking the whole
6600: 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64   tree, if no nod
6610: 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61  es are found tha
6620: 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20  t disqualify.** 
6630: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
6640: 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
6650: 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77   we assume the w
6660: 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  hole expression.
6670: 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  ** is constant. 
6680: 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
6690: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72  IsConstant() for
66a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
66b0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
66c0: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
66d0: 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a  sConstant(void *
66e0: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
66f0: 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e 20 3d 20  r){.  int *pN = 
6700: 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a 20 20 2f  (int*)pArg;..  /
6710: 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 33 20  * If *pArg is 3 
6720: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
6730: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6740: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
6750: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
6760: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
6770: 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  a join disqualif
6780: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
6790: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
67a0: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
67b0: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
67c0: 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20 45 78 70   (*pN)==3 && Exp
67d0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
67e0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
67f0: 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 4e 20 3d  in) ){.    *pN =
6800: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32   0;.    return 2
6810: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
6820: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
6830: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
6840: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
6850: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
6860: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
6870: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
6880: 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a  * and *pArg==2 *
6890: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
68a0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
68b0: 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20 72 65 74  ( (*pN)==2 ) ret
68c0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
68d0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
68e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
68f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
6900: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
6910: 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  DOT:.    case TK
6920: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
6930: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
6940: 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53  OLUMN:.#ifndef S
6950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6960: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
6970: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
6980: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
6990: 69 66 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30  if.      *pN = 0
69a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
69b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
69c0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
69d0: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
69e0: 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20        *pN = 0;. 
69f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
6a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66  .      }.    def
6a10: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
6a20: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
6a30: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
6a40: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
6a50: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
6a60: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
6a70: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
6a80: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
6a90: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
6aa0: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
6ab0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
6ac0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
6ad0: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
6ae0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
6af0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
6b00: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
6b10: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
6b20: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
6b30: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
6b40: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
6b50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
6b60: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
6b70: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
6b80: 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   1;.  walkExprTr
6b90: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
6ba0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
6bb0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
6bc0: 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Const;.}../*.** 
6bd0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
6be0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
6bf0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6c00: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
6c10: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
6c20: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
6c30: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
6c40: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
6c50: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
6c60: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
6c70: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
6c80: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
6c90: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
6ca0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
6cb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6cc0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
6cd0: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
6ce0: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
6cf0: 33 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  3;.  walkExprTre
6d00: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
6d10: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
6d20: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
6d30: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
6d40: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
6d50: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
6d60: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
6d70: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
6d80: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
6d90: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
6da0: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
6db0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
6dc0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
6dd0: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
6de0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
6df0: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
6e00: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
6e10: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6e20: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
6e30: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
6e40: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
6e50: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
6e60: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
6e70: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
6e80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
6e90: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
6ea0: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
6eb0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
6ec0: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
6ed0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
6ee0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
6ef0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
6f00: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
6f10: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6f20: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
6f30: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
6f40: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
6f50: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
6f60: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
6f70: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
6f80: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
6f90: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
6fa0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
6fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6fc0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6fd0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
6fe0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
6ff0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
7000: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
7010: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
7020: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
7030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7040: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
7050: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
7060: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
7070: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7080: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
7090: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
70a0: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
70b0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
70c0: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
70d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
70e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
70f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7100: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
7110: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
7120: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
7130: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
7140: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7150: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
7160: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
7170: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7180: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
7190: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
71a0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
71b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
71c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
71d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
71e0: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
71f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7200: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7210: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
7220: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
7230: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
7240: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
7250: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
7260: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
7270: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
7280: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
7290: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
72a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
72b0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
72c0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
72d0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
72e0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
72f0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
7300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7310: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
7320: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
7330: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
7340: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
7350: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
7360: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
7370: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
7380: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
7390: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
73a0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
73b0: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
73c0: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
73d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
73e0: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
73f0: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
7400: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
7410: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
7420: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
7430: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
7440: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
7470: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
7480: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
7490: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
74a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
74b0: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
74c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
74d0: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
74e0: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
74f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
7500: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
7510: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
7520: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
7530: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
7540: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
7550: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
7560: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
7570: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
7580: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
7590: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
75a0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
75b0: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
75c0: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
75d0: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
75e0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
75f0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
7600: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7610: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
7620: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
7630: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
7640: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
7650: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
7660: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
7670: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
7680: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
7690: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
76a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
76b0: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
76c0: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
76d0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
76e0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
76f0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
7700: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
7710: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
7720: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
7730: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
7740: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
7750: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
7760: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
7770: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
7780: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
7790: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
77a0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
77b0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
77c0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
77d0: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
77e0: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
77f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
7800: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
7810: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7820: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7830: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7840: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
7850: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7860: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
7870: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
7880: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
7890: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
78a0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
78b0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
78c0: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
78d0: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
78e0: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
78f0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
7900: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7910: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
7920: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
7930: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
7940: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
7950: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
7960: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
7970: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
7980: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
7990: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
79a0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
79b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
79c0: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
79d0: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
79e0: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
79f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7a00: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
7a10: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
7a20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
7a30: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
7a40: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
7a50: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
7a60: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
7a70: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
7a80: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
7a90: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
7aa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
7ab0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
7ac0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
7ad0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
7ae0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
7af0: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
7b00: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7b10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
7b20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
7b30: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7b40: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
7b50: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
7b60: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
7b70: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
7b80: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7b90: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
7ba0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
7bb0: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
7bc0: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
7bd0: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
7be0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
7bf0: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
7c00: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20   the list */..  
7c10: 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54  assert( pColumnT
7c20: 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54  oken && pColumnT
7c30: 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68  oken->z ); /* Th
7c40: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
7c50: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
7c60: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61   zDb = sqlite3Na
7c70: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
7c80: 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61  pDbToken);.  zTa
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 54 61  romToken(db, pTa
7cb0: 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f  bleToken);.  zCo
7cc0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
7cd0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f  romToken(db, pCo
7ce0: 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  lumnToken);.  if
7cf0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7d00: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c  ed ){.    goto l
7d10: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20  ookupname_end;. 
7d20: 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61   }..  pExpr->iTa
7d30: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c  ble = -1;.  whil
7d40: 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30  e( pNC && cnt==0
7d50: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
7d60: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72   *pEList;.    Sr
7d70: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
7d80: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
7d90: 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c 69  ..    if( pSrcLi
7da0: 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  st ){.      for(
7db0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c  i=0, pItem=pSrcL
7dc0: 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69  ist->a; i<pSrcLi
7dd0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
7de0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
7df0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7e00: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
7e10: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
7e20: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
7e30: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
7e40: 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
7e50: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
7e60: 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
7e70: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
7e80: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
7e90: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ema);.        as
7ea0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
7eb0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
7ec0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
7ed0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
7ee0: 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
7ef0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
7f00: 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c  ame = pItem->zAl
7f10: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ias;.           
7f20: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
7f30: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
7f40: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
7f50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
7f60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
7f70: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
7f80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7f90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
7fa0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c  abName==0 || sql
7fb0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
7fc0: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
7fd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7fe0: 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21 3d         if( zDb!=
7ff0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
8000: 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  Cmp(db->aDb[iDb]
8010: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
8020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8030: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8060: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
8070: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
8080: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
8090: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
80a0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
80b0: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
80c0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
80d0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
80e0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
80f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
8100: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
8110: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
8120: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
8130: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8140: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
8150: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
8160: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8170: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8180: 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
8190: 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
81a0: 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20           IdList 
81b0: 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20  *pUsing;.       
81c0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
81d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
81e0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
81f0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
8200: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
8210: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
8220: 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d  pExpr->pSchema =
8230: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
8240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8250: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f  ubstitute the ro
8260: 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20  wid (column -1) 
8270: 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
8280: 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20  PRIMARY KEY */. 
8290: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
82a0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70  ->iColumn = j==p
82b0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
82c0: 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  : j;.           
82d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
82e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
82f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
8300: 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78 70         if( (pExp
8310: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  r->flags & EP_Ex
8320: 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a  pCollate)==0 ){.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8340: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  xpr->pColl = sql
8350: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8360: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
8370: 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll,-1, 0);.     
8380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8390: 20 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c       if( i<pSrcL
83a0: 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  ist->nSrc-1 ){. 
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
83c0: 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79   pItem[1].jointy
83d0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
83e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
83f0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
8400: 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20  tch occurred in 
8410: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
8420: 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e  f a natural join
8430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8440: 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74    ** then skip t
8450: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74  he right table t
8460: 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63  o avoid a duplic
8470: 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  ate match */.   
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
8490: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
84a0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
84b0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
84c0: 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74  f( (pUsing = pIt
84d0: 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30  em[1].pUsing)!=0
84e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
84f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
8500: 61 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61  atch occurs on a
8510: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20   column that is 
8520: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
8530: 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  use.            
8540: 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e      ** of a join
8550: 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61 72 63  , skip the searc
8560: 68 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  h of the right t
8570: 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
8580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8590: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64   ** to avoid a d
85a0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74  uplicate match t
85b0: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
85c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e  for(k=0; k<pUsin
85f0: 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20  g->nId; k++){.  
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
8620: 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e  mp(pUsing->a[k].
8630: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
8640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8650: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8690: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
86a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
86b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
86e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
86f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8710: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8720: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
8730: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
8740: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
8750: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
8760: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
8770: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
8780: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
8790: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
87a0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
87b0: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
87c0: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
87d0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
87e0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
87f0: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
8800: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
8810: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
8820: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8830: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8840: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
8850: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
8860: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
8870: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
8880: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
8890: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
88a0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
88b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
88c0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
88d0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
88e0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
88f0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
8900: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
8910: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
8920: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
8930: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
8940: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
8950: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
8960: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
8970: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
8980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
8990: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
89a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
89b0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
89c0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
89d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
89e0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
89f0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f  iCol;.        Co
8a00: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61  lumn *pCol = pTa
8a10: 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  b->aCol;..      
8a20: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
8a30: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
8a40: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62  ;.        cntTab
8a50: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
8a60: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70  iCol=0; iCol < p
8a70: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
8a80: 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20  +, pCol++) {.   
8a90: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8aa0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
8ab0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
8ac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
8ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8ae0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
8af0: 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ol].zColl;.     
8b00: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
8b10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8b20: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d  >iColumn = iCol=
8b30: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
8b40: 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1 : iCol;.      
8b50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8b60: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
8b70: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
8b80: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
8b90: 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  f( (pExpr->flags
8ba0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
8bb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8bc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
8bd0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
8be0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
8bf0: 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30  db), zColl,-1, 0
8c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
8c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
8c20: 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  pr->pTab = pTab;
8c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8c40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
8c50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8c60: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
8c70: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
8c80: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
8c90: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
8ca0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
8cb0: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
8cc0: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
8cd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
8ce0: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
8cf0: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
8d00: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
8d10: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
8d20: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
8d30: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
8d40: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
8d50: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8d60: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8d70: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69  .    ** If the i
8d80: 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66  nput is of the f
8d90: 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f  orm Z (not Y.Z o
8da0: 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68  r X.Y.Z) then th
8db0: 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20  e name Z.    ** 
8dc0: 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61  might refer to a
8dd0: 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69  n result-set ali
8de0: 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  as.  This happen
8df0: 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
8e00: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61  when.    ** we a
8e10: 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d  re resolving nam
8e20: 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  es in the WHERE 
8e30: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
8e40: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a  llowing command:
8e50: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
8e60: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
8e70: 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48   x FROM table WH
8e80: 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a  ERE x<10;.    **
8e90: 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  .    ** In cases
8ea0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
8eb0: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
8ec0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
8ed0: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20  ression that.   
8ee0: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
8ef0: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
8f00: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
8f10: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
8f20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
8f30: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
8f40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  he expression in
8f50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8f60: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
8f70: 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  ady been.    ** 
8f80: 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20  resolved by the 
8f90: 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63  time the WHERE c
8fa0: 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65  lause is resolve
8fb0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
8fc0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c  ( cnt==0 && (pEL
8fd0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
8fe0: 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  t)!=0 && zTab==0
8ff0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
9000: 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; j<pEList->nEx
9010: 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
9020: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
9030: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
9040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41  ;.        if( zA
9050: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
9060: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
9070: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9080: 20 20 45 78 70 72 20 2a 70 44 75 70 2c 20 2a 70    Expr *pDup, *p
9090: 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Orig;.          
90a0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
90b0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
90c0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
90d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
90e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
90f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
9100: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 53 65  sert( pExpr->pSe
9110: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
9120: 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 4c       pOrig = pEL
9130: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b  ist->a[j].pExpr;
9140: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
9150: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26  pNC->allowAgg &&
9160: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9170: 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20  (pOrig, EP_Agg) 
9180: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
9190: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
91a0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
91b0: 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67  f aliased aggreg
91c0: 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20  ate %s", zAs);. 
91d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
91e0: 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  e3_free(zCol);. 
91f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9200: 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 2;.          }
9210: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
9220: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9230: 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20  (db, pOrig);.   
9240: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
9250: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
9260: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
9270: 20 20 20 20 20 20 20 70 44 75 70 2d 3e 70 43 6f         pDup->pCo
9280: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
9290: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
92a0: 44 75 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  Dup->flags |= EP
92b0: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
92c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
92d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70     if( pExpr->sp
92e0: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  an.dyn ) sqlite3
92f0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 45 78  _free((char*)pEx
9300: 70 72 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20  pr->span.z);.   
9310: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
9320: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
9330: 6c 69 74 65 33 5f 66 72 65 65 28 28 63 68 61 72  lite3_free((char
9340: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
9350: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
9360: 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c  cpy(pExpr, pDup,
9370: 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29   sizeof(*pExpr))
9380: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9390: 74 65 33 5f 66 72 65 65 28 70 44 75 70 29 3b 0a  te3_free(pDup);.
93a0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
93b0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
93c0: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
93d0: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
93e0: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
93f0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
9400: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b  ookupname_end_2;
9410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9420: 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   } .    }..    /
9430: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
9440: 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65   next name conte
9450: 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69  xt.  The loop wi
9460: 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74  ll exit when eit
9470: 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61  her.    ** we ha
9480: 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e  ve a match (cnt>
9490: 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75  0) or when we ru
94a0: 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f  n out of name co
94b0: 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ntexts..    */. 
94c0: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
94d0: 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43  .      pNC = pNC
94e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
94f0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
9500: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
9510: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
9520: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
9530: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
9540: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
9550: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
9560: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
9570: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
9580: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
9590: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
95a0: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
95b0: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
95c0: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
95d0: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
95e0: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
95f0: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
9600: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
9610: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
9620: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
9630: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
9640: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
9650: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
9660: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
9670: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
9680: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
9690: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
96a0: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
96b0: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
96c0: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
96d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
96e0: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
96f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
9700: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
9710: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
9720: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
9730: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
9740: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
9750: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
9760: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
9770: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
9780: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
9790: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
97a0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
97b0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
97c0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
97d0: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
97e0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
97f0: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
9800: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9810: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
9820: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
9830: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
9840: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
9850: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
9860: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
9870: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
9880: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
9890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
98a0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    z = sqlite3Str
98b0: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
98c0: 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  .    if( z ){.  
98d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
98e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
98f0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
9900: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
9910: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
9920: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
9930: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9940: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
9950: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63    }..  /* If a c
9960: 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62  olumn from a tab
9970: 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69  le in pSrcList i
9980: 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68  s referenced, th
9990: 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74  en record.  ** t
99a0: 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20  his fact in the 
99b0: 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c  pSrcList.a[].col
99c0: 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43  Used bitmask.  C
99d0: 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20  olumn 0 causes. 
99e0: 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20   ** bit 0 to be 
99f0: 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73  set.  Column 1 s
9a00: 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20  ets bit 1.  And 
9a10: 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68  so forth.  If th
9a20: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75  e.  ** column nu
9a30: 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
9a40: 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  than the number 
9a50: 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62  of bits in the b
9a60: 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e  itmask.  ** then
9a70: 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72   set the high-or
9a80: 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62  der bit of the b
9a90: 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  itmask..  */.  i
9aa0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
9ab0: 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d  n>=0 && pMatch!=
9ac0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  0 ){.    int n =
9ad0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
9ae0: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  .    if( n>=size
9af0: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b  of(Bitmask)*8 ){
9b00: 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f  .      n = sizeo
9b10: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a  f(Bitmask)*8-1;.
9b20: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
9b30: 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f  ( pMatch->iCurso
9b40: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
9b50: 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   );.    pMatch->
9b60: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
9b70: 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a  mask)1)<<n;.  }.
9b80: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a  .lookupname_end:
9b90: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
9ba0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
9bb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
9bc0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
9bd0: 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  ee(zTab);.  sqli
9be0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
9bf0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
9c00: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
9c10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9c20: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
9c30: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
9c40: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
9c50: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
9c60: 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  N;.lookupname_en
9c70: 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  d_2:.  sqlite3_f
9c80: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
9c90: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
9ca0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
9cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
9cc0: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
9cd0: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
9ce0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 74  t);.    if( pMat
9cf0: 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e 70  ch && !pMatch->p
9d00: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
9d10: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d  pExpr->pTab = pM
9d20: 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20  atch->pTab;.    
9d30: 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  }.    /* Increme
9d40: 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75  nt the nRef valu
9d50: 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f  e on all name co
9d60: 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e  ntexts from TopN
9d70: 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74  C up to.    ** t
9d80: 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74  he point where t
9d90: 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e  he name matched.
9da0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   */.    for(;;){
9db0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9dc0: 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  TopNC!=0 );.    
9dd0: 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b    pTopNC->nRef++
9de0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70  ;.      if( pTop
9df0: 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b  NC==pNC ) break;
9e00: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20  .      pTopNC = 
9e10: 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20  pTopNC->pNext;. 
9e20: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
9e30: 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  0;.  } else {.  
9e40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9e60: 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65  utine is designe
9e70: 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  d as an xFunc fo
9e80: 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
9e90: 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ..**.** Resolve 
9ea0: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69  symbolic names i
9eb0: 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70  nto TK_COLUMN op
9ec0: 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20  erators for the 
9ed0: 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20  current.** node 
9ee0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
9ef0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
9f00: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68  0 to continue th
9f10: 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a  e search down.**
9f20: 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74   the tree or 2 t
9f30: 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65  o abort the tree
9f40: 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   walk..**.** Thi
9f50: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
9f60: 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69  oes error checki
9f70: 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f  ng and name reso
9f80: 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75  lution for.** fu
9f90: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54  nction names.  T
9fa0: 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  he operator for 
9fb0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9fc0: 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a  ons is changed.*
9fd0: 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43  * to TK_AGG_FUNC
9fe0: 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TION..*/.static 
9ff0: 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  int nameResolver
a000: 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67 2c  Step(void *pArg,
a010: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
a020: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
a030: 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
a040: 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20  *)pArg;.  Parse 
a050: 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  *pParse;..  if( 
a060: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
a070: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
a080: 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  NC!=0 );.  pPars
a090: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
a0a0: 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  ..  if( ExprHasA
a0b0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
a0c0: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29  , EP_Resolved) )
a0d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78 70   return 1;.  Exp
a0e0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
a0f0: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
a100: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
a110: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63  .  if( pNC->pSrc
a120: 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72  List && pNC->pSr
a130: 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20  cList->nAlloc>0 
a140: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
a150: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
a160: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e  pSrcList;.    in
a170: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
a180: 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73  ; i<pNC->pSrcLis
a190: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
a1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
a1b0: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
a1c0: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
a1d0: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
a1e0: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
a1f0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
a200: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
a210: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
a220: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a230: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
a240: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
a250: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
a260: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
a270: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
a280: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
a290: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
a2a0: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
a2b0: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
a2c0: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
a2d0: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
a2e0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
a2f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
a300: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
a310: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
a320: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
a330: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
a340: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
a350: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
a360: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
a370: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
a380: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
a390: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
a3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a3b0: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
a3c0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
a3d0: 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72  se, 0, 0, &pExpr
a3e0: 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45  ->token, pNC, pE
a3f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
a400: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  rn 1;.    }.  . 
a410: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61     /* A table na
a420: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61  me and column na
a430: 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20  me:     ID.ID.  
a440: 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61    ** Or a databa
a450: 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  se, table and co
a460: 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a  lumn:  ID.ID.ID.
a470: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a480: 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_DOT: {.      
a490: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a  Token *pColumn;.
a4a0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61        Token *pTa
a4b0: 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  ble;.      Token
a4c0: 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70   *pDb;.      Exp
a4d0: 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20  r *pRight;..    
a4e0: 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73    /* if( pSrcLis
a4f0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f  t==0 ) break; */
a500: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
a510: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
a520: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
a530: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
a540: 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20        pDb = 0;. 
a550: 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20         pTable = 
a560: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
a570: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
a580: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
a590: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  >token;.      }e
a5a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
a5b0: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
a5c0: 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_DOT );.     
a5d0: 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d     pDb = &pExpr-
a5e0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
a5f0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20         pTable = 
a600: 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e  &pRight->pLeft->
a610: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
a620: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
a630: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b  ->pRight->token;
a640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
a650: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
a660: 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70  , pDb, pTable, p
a670: 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78  Column, pNC, pEx
a680: 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pr);.      retur
a690: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
a6a0: 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74  /* Resolve funct
a6b0: 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f  ion names.    */
a6c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
a6d0: 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
a6e0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
a6f0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
a700: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
a710: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
a720: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a   argument list *
a730: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
a740: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
a750: 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75  Expr : 0;  /* Nu
a760: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a770: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
a780: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b  o_such_func = 0;
a790: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a7a0: 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69  f no such functi
a7b0: 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  on exists */.   
a7c0: 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d     int wrong_num
a7d0: 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f  _args = 0;     /
a7e0: 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20  * True if wrong 
a7f0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
a800: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
a810: 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20   is_agg = 0;    
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
a830: 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67   if is an aggreg
a840: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
a850: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a860: 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20 20     int auth;    
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a880: 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * Authorization 
a890: 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63 74  to use the funct
a8a0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
a8b0: 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
a8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a8d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
a8e0: 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d   in function nam
a8f0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
a900: 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
a910: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
a920: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a  nction name. */.
a930: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
a940: 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Def;            
a950: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
a960: 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74   about the funct
a970: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
a980: 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
a990: 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65 20  e->db);  /* The 
a9a0: 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e  database encodin
a9b0: 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20  g */..      zId 
a9c0: 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  = (char*)pExpr->
a9d0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
a9e0: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
a9f0: 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
aa00: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
aa10: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
aa20: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65  , zId, nId, n, e
aa30: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
aa40: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
aa50: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
aa60: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
aa70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
aa80: 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30   nId, -1, enc, 0
aa90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
aaa0: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
aab0: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
aac0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
aad0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
aae0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
aaf0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ab00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ab10: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
ab20: 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20  >xFunc==0;.     
ab30: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ab40: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
ab50: 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20 70  TION.      if( p
ab60: 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Def ){.        a
ab70: 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75 74  uth = sqlite3Aut
ab80: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
ab90: 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20  QLITE_FUNCTION, 
aba0: 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  0, pDef->zName, 
abb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
abc0: 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  auth!=SQLITE_OK 
abd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
abe0: 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45   auth==SQLITE_DE
abf0: 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NY ){.          
ac00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ac10: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61  g(pParse, "not a
ac20: 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65  uthorized to use
ac30: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a   function: %s",.
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29      pDef->zName)
ac70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
ac80: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
ac90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
aca0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
acb0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  NULL;.          
acc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
acd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
ace0: 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  if.      if( is_
acf0: 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c  agg && !pNC->all
ad00: 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  owAgg ){.       
ad10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ad20: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
ad30: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
ad40: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20  nction %.*s()", 
ad50: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20  nId,zId);.      
ad60: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
ad70: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
ad80: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
ad90: 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  f( no_such_func 
ada0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
adb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
adc0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
add0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
ade0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
adf0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
ae00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
ae10: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
ae20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
ae30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
ae40: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
ae50: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
ae60: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
ae70: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
ae80: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
ae90: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
aea0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
aeb0: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
aec0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
aed0: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
aee0: 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20      pNC->hasAgg 
aef0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
af00: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
af10: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
af20: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
af30: 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26  ; pNC->nErr==0 &
af40: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
af50: 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65       walkExprTre
af60: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
af70: 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65  xpr, nameResolve
af80: 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20  rStep, pNC);.   
af90: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
afa0: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
afb0: 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  owAgg = 1;.     
afc0: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
afd0: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
afe0: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
aff0: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
b000: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
b010: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
b020: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b030: 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20  return is_agg;. 
b040: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b060: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
b070: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
b080: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
b090: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
b0a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
b0b0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
b0c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
b0d0: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66  = pNC->nRef;.#if
b0e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b0f0: 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69  _CHECK.        i
b100: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
b110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b120: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b130: 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73 20  rse,"subqueries 
b140: 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48  prohibited in CH
b150: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  ECK constraints"
b160: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
b170: 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69  dif.        sqli
b180: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
b190: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b1a0: 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20  pSelect, pNC);. 
b1b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b1c0: 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29  NC->nRef>=nRef )
b1d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  ;.        if( nR
b1e0: 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b  ef!=pNC->nRef ){
b1f0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
b200: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
b210: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b  , EP_VarSelect);
b220: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b230: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b240: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b250: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b260: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
b270: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  ABLE: {.      if
b280: 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29  ( pNC->isCheck )
b290: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b2a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b2b0: 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f  ,"parameters pro
b2c0: 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b  hibited in CHECK
b2d0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
b2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b2f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b300: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  f.  }.  return 0
b310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b320: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
b330: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b340: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
b350: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
b360: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
b370: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
b380: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
b390: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
b3a0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
b3b0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
b3c0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
b3d0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
b3e0: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
b3f0: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
b400: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
b410: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
b420: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
b430: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
b440: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
b450: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
b460: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
b470: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
b480: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
b490: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
b4a0: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
b4b0: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
b4c0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
b4d0: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
b4e0: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
b4f0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
b500: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
b510: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
b520: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
b530: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
b540: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
b550: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
b560: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
b570: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
b580: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
b590: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
b5a0: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
b5b0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
b5c0: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
b5d0: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
b5e0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f  .**.** Also reso
b5f0: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
b600: 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65  es and check the
b610: 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70   functions for p
b620: 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20  roper.** usage. 
b630: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66   Make sure all f
b640: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72  unction names ar
b650: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  e recognized and
b660: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a   all functions.*
b670: 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65  * have the corre
b680: 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
b690: 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61  uments.  Leave a
b6a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
b6b0: 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ** in pParse->zE
b6c0: 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e  rrMsg if anythin
b6d0: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74  g is amiss.  Ret
b6e0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b6f0: 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
b700: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
b710: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
b720: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  gate functions t
b730: 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41  hen set the EP_A
b740: 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f  gg.** property o
b750: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
b760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b770: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
b780: 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ( .  NameContext
b790: 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pNC,       /* 
b7a0: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73  Namespace to res
b7b0: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
b7c0: 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a   in. */.  Expr *
b7d0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
b7e0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b7f0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
b800: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ed. */.){.  int 
b810: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69  savedHasAgg;.  i
b820: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
b830: 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49  turn 0;.#if SQLI
b840: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
b850: 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70 72  H>0.  if( (pExpr
b860: 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70  ->nHeight+pNC->p
b870: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e  Parse->nHeight)>
b880: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
b890: 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71 6c  DEPTH ){.    sql
b8a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e 43  ite3ErrorMsg(pNC
b8b0: 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  ->pParse, .     
b8c0: 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74 72    "Expression tr
b8d0: 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ee is too large 
b8e0: 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20 25  (maximum depth %
b8f0: 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  d)",.       SQLI
b900: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
b910: 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65 74  H.    );.    ret
b920: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e 43  urn 1;.  }.  pNC
b930: 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  ->pParse->nHeigh
b940: 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69  t += pExpr->nHei
b950: 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73 61  ght;.#endif.  sa
b960: 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d  vedHasAgg = pNC-
b970: 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e  >hasAgg;.  pNC->
b980: 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61  hasAgg = 0;.  wa
b990: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
b9a0: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
b9b0: 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53 51  ep, pNC);.#if SQ
b9c0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
b9d0: 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61  PTH>0.  pNC->pPa
b9e0: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
b9f0: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
ba00: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
ba10: 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
ba20: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
ba30: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
ba40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d  ;.  }.  if( pNC-
ba50: 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45  >hasAgg ){.    E
ba60: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
ba70: 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20  Expr, EP_Agg);. 
ba80: 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64   }else if( saved
ba90: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e  HasAgg ){.    pN
baa0: 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20  C->hasAgg = 1;. 
bab0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72   }.  return Expr
bac0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
bad0: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a  r, EP_Error);.}.
bae0: 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  ./*.** A pointer
baf0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
bb00: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75  s structure is u
bb10: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
bb20: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75  rmation.** throu
bb30: 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20  gh walkExprTree 
bb40: 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72  into codeSubquer
bb50: 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65  yStep()..*/.type
bb60: 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79  def struct Query
bb70: 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72  Coder QueryCoder
bb80: 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f  ;.struct QueryCo
bb90: 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  der {.  Parse *p
bba0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20  Parse;       /* 
bbb0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
bbc0: 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ext */.  NameCon
bbd0: 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a  text *pNC;    /*
bbe0: 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69   Namespace of fi
bbf0: 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75  rst enclosing qu
bc00: 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  ery */.};.../*.*
bc10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bc20: 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75  for scalar subqu
bc30: 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e  eries used as an
bc40: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
bc50: 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e  nd IN operators.
bc60: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
bc70: 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20  *     (SELECT a 
bc80: 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20  FROM b)         
bc90: 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20   -- subquery.** 
bca0: 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45      EXISTS (SELE
bcb0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d  CT a FROM b)   -
bcc0: 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72  - EXISTS subquer
bcd0: 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34  y.**     x IN (4
bce0: 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20  ,5,11)          
bcf0: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
bd00: 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20  or with list on 
bd10: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a  right-hand side.
bd20: 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  **     x IN (SEL
bd30: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
bd40: 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72    -- IN operator
bd50: 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f   with subquery o
bd60: 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a  n the right.**.*
bd70: 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61  * The pExpr para
bd80: 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20  meter describes 
bd90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
bda0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
bdb0: 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20   IN.** operator 
bdc0: 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  or subquery..*/.
bdd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bde0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69  MIT_SUBQUERY.voi
bdf0: 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  d sqlite3CodeSub
be00: 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  select(Parse *pP
be10: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
be20: 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64  r){.  int testAd
be30: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be50: 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61   One-time test a
be60: 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65  ddress */.  Vdbe
be70: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
be80: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
be90: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
bea0: 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  n;...  /* This c
beb0: 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20  ode must be run 
bec0: 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79 20  in its entirety 
bed0: 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69 73  every time it is
bee0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
bef0: 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * if any of the 
bf00: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
bf10: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
bf20: 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  *  The right-han
bf30: 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72 72  d side is a corr
bf40: 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 0a  elated subquery.
bf50: 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72    **    *  The r
bf60: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69  ight-hand side i
bf70: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
bf80: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
bf90: 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20  variables.  **  
bfa0: 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69    *  We are insi
bfb0: 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a  de a trigger.  *
bfc0: 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  *.  ** If all of
bfd0: 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 66   the above are f
bfe0: 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61  alse, then we ca
bff0: 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  n run this code 
c000: 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73  just once.  ** s
c010: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c  ave the results,
c020: 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20 73   and reuse the s
c030: 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75  ame result on su
c040: 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74  bsequent invocat
c050: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
c060: 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70   !ExprHasAnyProp
c070: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56  erty(pExpr, EP_V
c080: 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50  arSelect) && !pP
c090: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
c0a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d  ){.    int mem =
c0b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
c0c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c0d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
c0e0: 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20  oad, mem, 0);.  
c0f0: 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c    testAddr = sql
c100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c110: 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20   OP_If, 0, 0);. 
c120: 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74 41     assert( testA
c130: 64 64 72 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d  ddr>0 || pParse-
c140: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c150: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
c160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c170: 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b  MemInt, 1, mem);
c180: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
c190: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c1a0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
c1b0: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
c1c0: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
c1d0: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
c1e0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
c1f0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
c200: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
c210: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
c220: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
c230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
c240: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
c250: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
c260: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
c270: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
c280: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
c290: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
c2a0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
c2b0: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
c2c0: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76  he same way. A v
c2d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
c2e0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
c2f0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
c300: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
c310: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
c320: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
c330: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
c340: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
c350: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
c360: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
c370: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c380: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
c390: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
c3a0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
c3b0: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
c3c0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
c3d0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
c3e0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
c3f0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
c400: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
c410: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
c420: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
c430: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
c440: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
c450: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
c460: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
c470: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
c480: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
c490: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
c4a0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
c4b0: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
c4c0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
c4d0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
c4e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
c4f0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
c500: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
c510: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
c520: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
c530: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
c540: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
c550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c560: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  p(v, OP_OpenEphe
c570: 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
c580: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
c590: 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c  memset(&keyInfo,
c5a0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e   0, sizeof(keyIn
c5b0: 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49  fo));.      keyI
c5c0: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a  nfo.nField = 1;.
c5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
c5f0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70  NumColumns, pExp
c600: 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a  r->iTable, 1);..
c610: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
c620: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
c630: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
c640: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
c650: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
c660: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
c670: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
c680: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
c690: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
c6a0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nto the temporar
c6b0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  y.        ** tab
c6c0: 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  le allocated and
c6d0: 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20   opened above.. 
c6e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c6f0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45    int iParm = pE
c700: 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28  xpr->iTable +  (
c710: 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c  ((int)affinity)<
c720: 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78  <16);.        Ex
c730: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
c740: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c750: 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
c760: 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
c770: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
c780: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c790: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c7a0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53  Expr->pSelect, S
c7b0: 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30  RT_Set, iParm, 0
c7c0: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
c7d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c7f0: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
c800: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
c810: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
c820: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
c830: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
c840: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
c850: 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
c860: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
c870: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
c880: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
c890: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
c8a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
c8b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c8c0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
c8d0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
c8e0: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
c8f0: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
c900: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
c910: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
c920: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
c930: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
c940: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
c950: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
c960: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
c970: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c980: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
c990: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
c9a0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
c9b0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
c9c0: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
c9d0: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
c9e0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
c9f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
ca00: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
ca10: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
ca20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
ca30: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
ca40: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
ca50: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
ca60: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
ca70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ca80: 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  m;..        if( 
ca90: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
caa0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
cab0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
cac0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
cad0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
cae0: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
caf0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
cb00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
cb10: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
cb20: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
cb30: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
cb40: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
cb50: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
cb60: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
cb70: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
cb80: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
cb90: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
cba0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
cbb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
cbc0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
cbd0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
cbe0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
cbf0: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
cc00: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
cc10: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
cc20: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
cc30: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
cc40: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
cc50: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
cc60: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
cc70: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
cc80: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
cc90: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
cca0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
ccb0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ccc0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
ccd0: 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  >0 && !sqlite3Ex
cce0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
ccf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
cd00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
cd10: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
cd20: 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20  Addr-1, 3);.    
cd30: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
cd50: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
cd60: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
cd70: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
cd80: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
cd90: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
cda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
cdb0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
cdc0: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
cdd0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
cde0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
cdf0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
ce00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
ce10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce20: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
ce30: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
ce40: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
ce50: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ce60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
ce70: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
ce80: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )&keyInfo, P3_KE
ce90: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72  YINFO);.      br
cea0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
ceb0: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
cec0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
ced0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
cee0: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
cef0: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
cf00: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
cf10: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
cf20: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
cf30: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
cf40: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
cf50: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
cf60: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
cf70: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
cf80: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
cf90: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
cfa0: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
cfb0: 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d  (u8*)"1", 0, 1 }
cfc0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
cfd0: 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  pSel;.      int 
cfe0: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  iMem;.      int 
cff0: 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70  sop;..      pExp
d000: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65  r->iColumn = iMe
d010: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
d020: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  ++;.      pSel =
d030: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
d040: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
d050: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
d060: 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  ){.        sop =
d070: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
d080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d090: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
d0a0: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
d0b0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d0c0: 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71  (v, "# Init subq
d0d0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
d0e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0f0: 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45       sop = SRT_E
d100: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
d110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d120: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
d130: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
d140: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d150: 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72  "# Init EXISTS r
d160: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
d170: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
d180: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
d190: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d1a0: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
d1b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
d1c0: 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
d1d0: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
d1e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
d1f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
d200: 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20  , sop, iMem, 0, 
d210: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
d220: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
d230: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
d250: 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20  ( testAddr ){.  
d260: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d270: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
d280: 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
d290: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
d2a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
d2b0: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65  ERY */../*.** Ge
d2c0: 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
d2d0: 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
d2e0: 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
d2f0: 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
d300: 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e  ext z[0..n-1] on
d310: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73   the stack..*/.s
d320: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
d330: 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20  nteger(Vdbe *v, 
d340: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
d350: 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt n){.  assert(
d360: 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71   z || v==0 || sq
d370: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e  lite3VdbeDb(v)->
d380: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d390: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 69    if( z ){.    i
d3a0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 71  nt i;.    if( sq
d3b0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c  lite3GetInt32(z,
d3c0: 20 26 69 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &i) ){.      sq
d3d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d3e0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
d3f0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   0);.    }else i
d400: 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  f( sqlite3FitsIn
d410: 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20  64Bits(z) ){.   
d420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
d430: 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  3(v, OP_Int64, 0
d440: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  , 0, z, n);.    
d450: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
d460: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
d470: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
d480: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   n);.    }.  }.}
d490: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
d4a0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
d4b0: 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
d4c0: 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
d4d0: 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
d4e0: 62 20 61 6e 64 20 70 75 73 68 20 74 68 61 74 20  b and push that 
d4f0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 6e 20  column value on 
d500: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 72  the stack.  Ther
d510: 65 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 65 6e 20  e.** is an open 
d520: 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69  cursor to pTab i
d530: 6e 20 69 54 61 62 6c 65 2e 20 20 49 66 20 69 43  n iTable.  If iC
d540: 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 0a 2a 2a 20  olumn<0 then.** 
d550: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
d560: 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20  d that extracts 
d570: 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  the rowid..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
d590: 64 65 47 65 74 43 6f 6c 75 6d 6e 28 56 64 62 65  deGetColumn(Vdbe
d5a0: 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62   *v, Table *pTab
d5b0: 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69  , int iColumn, i
d5c0: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66  nt iTable){.  if
d5d0: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
d5e0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61     int op = (pTa
d5f0: 62 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70  b && IsVirtual(p
d600: 54 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69  Tab)) ? OP_VRowi
d610: 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20  d : OP_Rowid;.  
d620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d630: 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65  Op(v, op, iTable
d640: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
d650: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d670: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
d680: 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29  iTable, iColumn)
d690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
d6a0: 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
d6b0: 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
d6c0: 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
d6d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d6e0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54  eAddOp(v, op, iT
d6f0: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  able, iColumn);.
d700: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
d710: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
d720: 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e  , iColumn);.#ifn
d730: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d740: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
d750: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
d760: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
d770: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d780: 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71  REAL ){.      sq
d790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d7a0: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
d7b0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  y, 0, 0);.    }.
d7c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
d7d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d7e0: 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
d7f0: 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
d800: 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
d810: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
d820: 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74  leave the result
d830: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73   on the top of s
d840: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
d850: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
d860: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
d870: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
d880: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
d890: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
d8a0: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
d8b0: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
d8c0: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
d8d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
d8e0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
d8f0: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
d900: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
d910: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
d920: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
d930: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
d940: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
d950: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
d960: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
d970: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
d980: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
d990: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
d9a0: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
d9b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d9c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
d9d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
d9e0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d9f0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
da00: 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e  ;.  int stackChn
da10: 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f  g = 1;    /* Amo
da20: 75 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f  unt of change to
da30: 20 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a   stack depth */.
da40: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
da50: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
da60: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
da70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
da80: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
da90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
daa0: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
dab0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
dac0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
dad0: 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
dae0: 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
daf0: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
db00: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
db10: 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
db20: 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
db30: 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
db40: 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
db50: 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
db60: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
db70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db80: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
db90: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b   pCol->iMem, 0);
dba0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dbb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbc0: 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
dbd0: 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
dbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dbf0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
dc00: 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
dc10: 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
dc40: 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  terColumn);.    
dc50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dc60: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
dc70: 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
dc80: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
dc90: 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
dca0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
dcb0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
dcc0: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
dcd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
dce0: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
dcf0: 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
dd00: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
dd10: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
dd20: 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  t( pParse->ckOff
dd30: 73 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  set>0 );.       
dd40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dd50: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61  p(v, OP_Dup, pPa
dd60: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45  rse->ckOffset-pE
dd70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20  xpr->iColumn-1, 
dd80: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
dd90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dda0: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
ddb0: 6e 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62  n(v, pExpr->pTab
ddc0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
ddd0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
de00: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
de10: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
de20: 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29  teger(v, (char*)
de30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
de40: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
de50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
de60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
de70: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
de80: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
de90: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c     assert( TK_FL
dea0: 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a  OAT==OP_Real );.
deb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
dec0: 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69  _STRING==OP_Stri
ded0: 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ng8 );.      sql
dee0: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
def0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
df00: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
df10: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
df20: 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78  0, 0, (char*)pEx
df30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
df40: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
df50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
df60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
df70: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
df80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
df90: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
dfa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dfb0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
dfc0: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
dfd0: 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
dfe0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
dff0: 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
e000: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61  char *z;.      a
e010: 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d  ssert( TK_BLOB==
e020: 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20  OP_HexBlob );.  
e030: 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74      n = pExpr->t
e040: 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20  oken.n - 3;.    
e050: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78    z = (char*)pEx
e060: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b  pr->token.z + 2;
e070: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
e080: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
e090: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
e0a0: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d   z = "";.      }
e0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e0c0: 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20  beOp3(v, op, 0, 
e0d0: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  0, z, n);.      
e0e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
e0f0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
e100: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
e110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e120: 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  Op(v, OP_Variabl
e130: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
e140: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
e150: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
e160: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e170: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
e180: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45  v, -1, (char*)pE
e190: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
e1a0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
e1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e1c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e1d0: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
e1e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e1f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e200: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
e210: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
e220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
e230: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e240: 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
e250: 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
e260: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
e270: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
e280: 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
e290: 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  en) */.      int
e2a0: 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20   aff, to_op;.   
e2b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e2c0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e2d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e2e0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
e2f0: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
e300: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
e310: 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51  to_op = aff - SQ
e320: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20  LITE_AFF_TEXT + 
e330: 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20  OP_ToText;.     
e340: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e350: 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20  OP_ToText    || 
e360: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e370: 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20  TEXT    );.     
e380: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e390: 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
e3a0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e3b0: 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
e3c0: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e3d0: 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20  OP_ToNumeric || 
e3e0: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e3f0: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20  NUMERIC );.     
e400: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e410: 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20  OP_ToInt     || 
e420: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e430: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
e440: 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d   assert( to_op==
e450: 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20  OP_ToReal    || 
e460: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
e470: 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20  REAL    );.     
e480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e490: 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20 30  p(v, to_op, 0, 0
e4a0: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
e4b0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
e4c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
e4d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e4e0: 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
e4f0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
e500: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
e510: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
e520: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
e530: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
e540: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
e550: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
e560: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
e570: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
e580: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
e590: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
e5a0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
e5b0: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
e5c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e5d0: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
e5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e5f0: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
e600: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e610: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
e620: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
e630: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e640: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e650: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
e660: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
e670: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e680: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
e690: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
e6a0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31    stackChng = -1
e6b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e6c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e6d0: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
e6e0: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
e6f0: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
e700: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
e710: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
e720: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
e730: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
e740: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
e750: 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
e760: 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
e770: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
e780: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
e790: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
e7a0: 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
e7b0: 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
e7c0: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
e7d0: 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
e7e0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
e7f0: 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
e800: 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
e810: 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
e820: 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
e830: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
e840: 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
e850: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e860: 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
e870: 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
e880: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
e890: 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
e8a0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
e8b0: 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
e8c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e8d0: 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
e8e0: 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
e8f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
e900: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
e910: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
e920: 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
e930: 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
e940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e950: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e960: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
e970: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e980: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e990: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
e9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e9b0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
e9c0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
e9d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e9f0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
ea00: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
ea10: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
ea20: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
ea30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
ea40: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
ea50: 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
ea60: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
ea70: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
ea80: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
ea90: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
eaa0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
eab0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 2d 25 2e  pParse->db, "-%.
eac0: 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29  *s", p->n, p->z)
ead0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
eae0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
eaf0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  T ){.          s
eb00: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
eb10: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20   OP_Real, 0, 0, 
eb20: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
eb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb40: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
eb50: 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a  (v, z, p->n+1);.
eb60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eb80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
eb90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eba0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
ebb0: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
ebc0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ebd0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
ebe0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
ebf0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
ec00: 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
ec10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ec20: 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
ec30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ec40: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ec50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ec70: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
ec80: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
ec90: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
eca0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ecb0: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
ecc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ecd0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
ece0: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73 73   dest;.      ass
ecf0: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
ed00: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
ed10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
ed20: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
ed30: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
ed40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ed50: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
ed60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
ed70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ed80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
ed90: 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69       dest = sqli
eda0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
edb0: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20  dr(v) + 2;.     
edc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
edd0: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
ede0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
edf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ee00: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
ee10: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
ee20: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
ee30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ee40: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
ee50: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
ee60: 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
ee70: 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
ee80: 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
ee90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eea0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
eeb0: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
eec0: 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20  regate: %T",.   
eed0: 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72 2d           &pExpr-
eee0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65  >span);.      }e
eef0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
ef00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ef10: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e   OP_MemLoad, pIn
ef20: 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
ef30: 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b  >iAgg].iMem, 0);
ef40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ef50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ef60: 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
ef70: 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
ef80: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
ef90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
efa0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
efb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
efc0: 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  r = pList ? pLis
efd0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
efe0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
eff0: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  f;.      int nId
f000: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
f010: 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69  ar *zId;.      i
f020: 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
f030: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
f040: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
f050: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f060: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
f070: 43 28 64 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c  C(db);.      Col
f080: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
f090: 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63  ..      zId = (c
f0a0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
f0b0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  n.z;.      nId =
f0c0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
f0d0: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
f0e0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
f0f0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
f100: 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65  d, nId, nExpr, e
f110: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
f120: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
f130: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
f140: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
f150: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
f160: 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  List);.#ifndef S
f170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f180: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
f190: 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
f1a0: 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
f1b0: 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
f1c0: 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
f1d0: 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
f1e0: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
f1f0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
f200: 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
f210: 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
f220: 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
f230: 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
f240: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
f250: 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
f260: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
f270: 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
f280: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
f290: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
f2a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
f2b0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
f2c0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
f2d0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
f2e0: 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
f2f0: 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
f300: 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
f310: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
f320: 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
f330: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
f340: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
f350: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
f360: 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
f370: 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
f380: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
f390: 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
f3a0: 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
f3b0: 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
f3c0: 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
f3d0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
f3e0: 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
f3f0: 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
f400: 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
f410: 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
f420: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70  /.      if( nExp
f430: 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  r>=2 && (pExpr->
f440: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
f450: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
f460: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
f470: 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
f480: 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45  ion(db, pDef, nE
f490: 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr, pList->a[1]
f4a0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
f4b0: 65 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30  else if( nExpr>0
f4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
f4d0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
f4e0: 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
f4f0: 62 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  b, pDef, nExpr, 
f500: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
f510: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
f520: 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  if.      for(i=0
f530: 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33  ; i<nExpr && i<3
f540: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
f550: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f560: 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74  IsConstant(pList
f570: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
f580: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
f590: 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
f5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5b0: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
f5c0: 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c  CollSeq && !pCol
f5d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
f5e0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f5f0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f600: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
f610: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
f620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f630: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
f640: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seq ){.        i
f650: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
f660: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
f670: 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
f680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f690: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
f6a0: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
f6b0: 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
f6c0: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
f6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
f6e0: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
f6f0: 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70   constMask, nExp
f700: 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
f710: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
f720: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31     stackChng = 1
f730: 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72  -nExpr;.      br
f740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
f750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f760: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
f770: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
f780: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
f790: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
f7a0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
f7b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f7c0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
f7d0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
f7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f800: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
f810: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
f820: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f830: 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75  t((v, "# load su
f840: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
f850: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f860: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f870: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
f880: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61   addr;.      cha
f890: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
f8a0: 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
f8b0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
f8c0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
f8d0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
f8e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20  arse, pExpr);.. 
f8f0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
f900: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
f910: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
f920: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
f930: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
f940: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f950: 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
f960: 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
f970: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
f980: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20  for.      ** P3 
f990: 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
f9a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f9b0: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
f9c0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
f9d0: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71  Expr);..      sq
f9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f9f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
fa00: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
fa10: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 28 63  e->ckOffset = (c
fa20: 6b 4f 66 66 73 65 74 20 3f 20 28 63 6b 4f 66 66  kOffset ? (ckOff
fa30: 73 65 74 2b 31 29 20 3a 20 30 29 3b 0a 0a 20 20  set+1) : 0);..  
fa40: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
fa50: 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
fa60: 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
fa70: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fa80: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
fa90: 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
faa0: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
fab0: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
fac0: 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
fad0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fae0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
faf0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
fb00: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fb10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fb20: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
fb30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fb40: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
fb50: 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
fb60: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
fb70: 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
fb80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fb90: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
fba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fbb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
fbc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
fbd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fbe0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
fbf0: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
fc00: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
fc10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
fc20: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
fc30: 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 34  );   /* addr + 4
fc40: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
fc50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fc60: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
fc70: 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a  Table, addr+7);.
fc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
fca0: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20  Imm, -1, 0);    
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcc0: 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20   addr + 6 */..  
fcd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fce0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
fcf0: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
fd00: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
fd10: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
fd20: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
fd30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
fd40: 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
fd50: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
fd60: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
fd70: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
fd80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fd90: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
fda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fdb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
fdc0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
fdd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
fde0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
fdf0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
fe00: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
fe10: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
fe20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
fe30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fe40: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
fe50: 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
fe60: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
fe70: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
fe80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fe90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
fea0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
feb0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
fec0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
fed0: 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Le, 0, 0);.  
fee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fef0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  ddOp(v, OP_And, 
ff00: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
ff10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ff20: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
ff30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ff40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
ff50: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
ff60: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
ff70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ff80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ff90: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
ffa0: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
ffb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
ffc0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
ffd0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
ffe0: 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   i;.      ExprLi
fff0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
10000 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10010 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
10020 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  m;..      assert
10030 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  (pExpr->pList);.
10040 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
10050 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
10060 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
10070 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
10080 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  ->pList->nExpr >
10090 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
100a0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
100b0 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
100c0 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
100d0 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
100e0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
100f0 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c    expr_end_label
10100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10110 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10120 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
10130 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
10140 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10150 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10160 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
10170 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
10180 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
10190 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
101a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
101b0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29  stelem[i].pExpr)
101c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
101d0 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
101e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
101f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
10200 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
10210 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
10220 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
10230 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10240 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
10250 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c         OP_Ne, 0,
10280 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
10290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
102a0 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
102b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
102c0 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
102d0 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
102e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
102f0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
10300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
10310 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10320 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
10330 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
10340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10350 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
10360 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
10370 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
10380 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10390 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20  (v, jumpInst);. 
103a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
103b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
103c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
103d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
103e0 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
103f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
10400 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
10410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10420 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10430 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
10440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10460 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
10470 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
10480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10490 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
104a0 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
104b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
104c0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
104d0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
104e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
104f0 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
10500 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
10510 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
10520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10530 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
10550 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
10560 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
10570 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
10580 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10590 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
105a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
105b0 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29  umn!=OE_Ignore )
105c0 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
105d0 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
105e0 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  n==OE_Rollback |
105f0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
10600 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
10610 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c  n == OE_Abort ||
10620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10630 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
10640 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20   == OE_Fail );. 
10650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
10660 65 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73  equoteExpr(pPars
10670 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
10680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10690 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c  dbeOp3(v, OP_Hal
106a0 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
106b0 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f  AINT, pExpr->iCo
106c0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
106e0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
106f0 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
10700 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  n.n);.      } el
10710 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73  se {.         as
10720 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
10730 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72  lumn == OE_Ignor
10740 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  e );.         sq
10750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10760 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c  , OP_ContextPop,
10770 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
10780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10790 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
107a0 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
107b0 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b  ck->ignoreJump);
107c0 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  .         VdbeCo
107d0 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69  mment((v, "# rai
107e0 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20  se(IGNORE)"));. 
107f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
10800 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
10810 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
10820 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
10830 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
10840 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  t ){.    pParse-
10850 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74 61  >ckOffset += sta
10860 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73 73 65  ckChng;.    asse
10870 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  rt( pParse->ckOf
10880 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  fset );.  }.}..#
10890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
108a0 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a  IT_TRIGGER./*.**
108b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
108c0 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
108d0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
108e0 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65  n and leaves the
108f0 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68   result.** on th
10900 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61 6c  e stack.  See al
10910 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  so sqlite3ExprCo
10920 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  de()..**.** This
10930 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61   routine might a
10940 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72 65  lso cache the re
10950 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79 20  sult and modify 
10960 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a 2a  the pExpr tree.*
10970 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  * so that it wil
10980 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68  l make use of th
10990 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74 20  e cached result 
109a0 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65 76  on subsequent ev
109b0 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74  aluations.** rat
109c0 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61 74  her than evaluat
109d0 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72  e the whole expr
109e0 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54  ession again.  T
109f0 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69 6f  rivial expressio
10a00 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61  ns are.** not ca
10a10 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65 78  ched.  If the ex
10a20 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63 68  pression is cach
10a30 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20 69  ed, its result i
10a40 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a  s stored in a .*
10a50 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  * memory locatio
10a60 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
10a70 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63  e3ExprCodeAndCac
10a80 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
10a90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
10aa0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10ab0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
10ac0 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64   iMem;.  int add
10ad0 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66 28  r1, addr2;.  if(
10ae0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10af0 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
10b00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10b10 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  (v);.  sqlite3Ex
10b20 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10b30 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20 3d  Expr);.  addr2 =
10b40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10b50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
10b60 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31 20  ( addr2>addr1+1 
10b70 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  || sqlite3VdbeGe
10b80 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f  tOp(v, addr1)->o
10b90 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69  pcode==OP_Functi
10ba0 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d  on ){.    iMem =
10bb0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
10bc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
10bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10be0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
10bf0 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a  tore, iMem, 0);.
10c00 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
10c10 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d  TK_REGISTER;.  }
10c20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10c30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10c40 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
10c50 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
10c60 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
10c70 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
10c80 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73   list onto the s
10c90 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tack..**.** Retu
10ca0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
10cb0 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64   elements pushed
10cc0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
10cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
10ce0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
10cf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10d00 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
10d10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
10d20 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
10d30 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
10d40 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
10d50 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ded */.){.  stru
10d60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
10d70 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
10d80 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  , n;.  if( pList
10d90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10da0 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
10db0 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
10dc0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69  pList->a, i=n; i
10dd0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
10de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
10df0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10e00 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
10e10 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10e20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10e30 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
10e40 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
10e50 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
10e60 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
10e70 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
10e80 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10e90 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63  is true but exec
10ea0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
10eb0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
10ec0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
10ed0 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  on is false..**.
10ee0 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
10ef0 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
10f00 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
10f10 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c  true nor false),
10f20 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68   then.** take th
10f30 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75  e jump if the ju
10f40 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73  mpIfNull flag is
10f50 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   true..**.** Thi
10f60 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
10f70 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
10f80 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
10f90 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
10fa0 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
10fb0 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
10fc0 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
10fd0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
10fe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
10ff0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
11000 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
11010 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
11020 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
11030 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
11040 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
11050 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
11060 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
11070 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
11080 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
11090 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
110a0 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
110b0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
110c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
110d0 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
110e0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
110f0 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
11100 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
11110 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
11120 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
11130 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65  0;.  int ckOffse
11140 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  t = pParse->ckOf
11150 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30  fset;.  if( v==0
11160 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
11170 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45  eturn;.  op = pE
11180 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
11190 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
111a0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
111b0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
111c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
111d0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
111e0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
111f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
11200 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
11210 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
11220 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
11230 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
11240 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
11250 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
11260 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11270 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
11280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11290 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
112a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
112b0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
112c0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
112d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
112e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112f0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
11300 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
11310 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11320 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11340 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
11350 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
11360 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
11370 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
11380 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
11390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
113a0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
113b0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
113c0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
113d0 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
113e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
113f0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
11400 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11410 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
11420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11430 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
11440 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
11450 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
11460 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
11470 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
11480 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
11490 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
114a0 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
114b0 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ne );.      sqli
114c0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
114d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
114e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
114f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11500 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
11510 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
11520 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
11530 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
11540 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
11550 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
11560 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11570 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
11580 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
11590 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
115a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
115b0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
115c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
115d0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
115e0 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
115f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11600 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
11610 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
11620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11630 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
11640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11650 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
11660 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
11670 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
11680 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41  n "x BETWEEN y A
11690 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65  ND z" is impleme
116a0 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  nted as:.      *
116b0 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20  *.      ** 1 IF 
116c0 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20  (x < y) GOTO 3. 
116d0 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20       ** 2 IF (x 
116e0 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74  <= z) GOTO <dest
116f0 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e  >.      ** 3 ...
11700 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11710 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
11720 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
11730 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
11740 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
11750 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
11760 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
11770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11780 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
11790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
117a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
117b0 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
117c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
117d0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
117e0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f  .      addr = co
117f0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
11800 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
11810 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70   OP_Lt, 0, !jump
11820 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
11830 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
11840 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
11850 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11860 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11870 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
11880 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11890 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
118a0 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20  t, OP_Le, dest, 
118b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  jumpIfNull);..  
118c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
118d0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
118e0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  er, 0, 0);.     
118f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11900 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
11910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11920 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
11930 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   1, 0);.      br
11940 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
11950 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11960 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11970 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
11980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11990 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
119a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
119b0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
119c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
119d0 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20  rse->ckOffset = 
119e0 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  ckOffset;.}../*.
119f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11a00 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
11a10 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
11a20 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
11a30 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
11a40 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
11a50 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
11a60 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
11a70 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
11a80 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
11a90 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11aa0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
11ab0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
11ac0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
11ad0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
11ae0 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
11af0 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
11b00 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f  IfNull is true o
11b10 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
11b20 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
11b30 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  false..*/.void s
11b40 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
11b50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
11b60 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
11b70 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
11b80 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
11b90 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11ba0 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
11bb0 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74  ;.  int ckOffset
11bc0 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66   = pParse->ckOff
11bd0 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  set;.  if( v==0 
11be0 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
11bf0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
11c00 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
11c10 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
11c20 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
11c30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
11c40 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
11c50 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
11c60 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
11c70 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
11c80 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
11c90 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
11ca0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
11cb0 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
11cc0 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
11cd0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
11ce0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
11cf0 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
11d00 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
11d10 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
11d20 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
11d30 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
11d40 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
11d60 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
11d70 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
11d80 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
11d90 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
11da0 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
11db0 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
11dc0 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
11dd0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
11de0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
11df0 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
11e00 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
11e10 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
11e20 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
11e30 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
11e40 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
11e50 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
11e60 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
11e70 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
11e80 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
11e90 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
11ea0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
11eb0 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
11ec0 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
11ed0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
11ee0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
11ef0 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
11f00 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
11f10 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
11f20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
11f30 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
11f40 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
11f50 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
11f60 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
11f70 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
11f80 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
11f90 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
11fa0 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
11fb0 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
11fc0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
11fd0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
11fe0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
11ff0 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
12000 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
12010 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
12020 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
12030 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
12040 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
12050 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
12060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
12070 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
12080 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
12090 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
120a0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
120b0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
120c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
120d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
120e0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
120f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
12100 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
12110 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
12120 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
12130 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
12140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12150 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
12160 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
12170 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
12180 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
12190 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
121a0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
121b0 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d  >pLeft, d2, !jum
121c0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
121d0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
121e0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
121f0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
12200 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
12210 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
12220 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
12230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12240 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12250 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
12260 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
12270 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
12280 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
12290 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
122a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
122b0 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
122c0 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
122d0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
122e0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
122f0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
12300 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
12310 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
12320 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
12330 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
12340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12350 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12360 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
12370 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
12380 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12390 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
123a0 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   op, dest, jumpI
123b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
123c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
123d0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
123e0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
123f0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
12400 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
12410 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
12420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12430 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
12440 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
12450 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12460 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
12470 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
12480 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
12490 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
124a0 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65   z". It is imple
124b0 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
124c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
124d0 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20  F (x >= y) GOTO 
124e0 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54  3.      ** 2 GOT
124f0 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
12500 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47  * 3 IF (x > z) G
12510 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
12520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
12530 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
12540 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
12550 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
12560 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
12570 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
12580 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
12590 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
125a0 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
125b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125c0 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
125d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
125e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
125f0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
12600 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
12610 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12620 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
12630 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
12640 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
12650 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70  e, addr+3, !jump
12660 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
12670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12680 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
12690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
126a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
126b0 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
126c0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
126d0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
126e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
126f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
12700 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
12710 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
12720 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
12730 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20   pRight, OP_Gt, 
12740 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
12750 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12760 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
12770 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
12780 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12790 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
127a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
127b0 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a  p(v, OP_IfNot, j
127c0 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
127d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
127e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
127f0 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b  e->ckOffset = ck
12800 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Offset;.}../*.**
12810 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
12820 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
12830 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
12840 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
12850 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
12860 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
12870 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
12880 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
12890 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
128a0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
128b0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
128c0 74 75 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20  turn FALSE even 
128d0 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
128e0 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
128f0 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
12900 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
12910 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
12920 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
12930 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
12940 65 74 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74  eturn FALSE just
12950 20 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f   to be safe.  So
12960 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
12970 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73  .** returns fals
12980 65 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e  e, then you do n
12990 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66  ot really know f
129a0 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20 74 68  or certain if th
129b0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
129c0 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d  ions are the sam
129d0 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75 20 67  e.  But if you g
129e0 65 74 20 61 20 54 52 55 45 20 72 65 74 75 72 6e  et a TRUE return
129f0 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61  , then you.** ca
12a00 6e 20 62 65 20 73 75 72 65 20 74 68 65 20 65 78  n be sure the ex
12a10 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
12a20 65 20 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20  e same.  In the 
12a30 70 6c 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20  places where.** 
12a40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12a50 75 73 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f  used, it does no
12a60 74 20 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e  t hurt to get an
12a70 20 65 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74   extra FALSE - t
12a80 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
12a90 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
12aa0 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
12ab0 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
12ac0 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
12ad0 72 72 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64  rrect TRUE could
12ae0 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75   lead to a malfu
12af0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
12b00 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
12b10 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
12b20 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
12b30 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d    if( pA==0||pB=
12b40 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
12b50 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69   pB==pA;.  }.  i
12b60 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
12b70 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
12b80 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
12b90 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
12ba0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
12bb0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
12bc0 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
12bd0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
12be0 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
12bf0 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
12c00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
12c10 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
12c20 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
12c30 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
12c40 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
12c50 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
12c60 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
12c70 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
12c80 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
12c90 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
12ca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
12cb0 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
12cc0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
12cd0 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
12ce0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
12cf0 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
12d00 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
12d10 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
12d20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
12d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
12d50 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
12d60 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
12d70 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
12d80 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
12d90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
12da0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
12db0 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
12dc0 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
12dd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12de0 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  f( pA->op!=TK_CO
12df0 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65  LUMN && pA->toke
12e00 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
12e10 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
12e20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
12e30 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
12e40 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
12e50 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
12e60 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
12e70 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e  char*)pA->token.
12e80 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b  z,(char*)pB->tok
12e90 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  en.z,pB->token.n
12ea0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
12eb0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
12ec0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
12ed0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
12ee0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
12ef0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
12f00 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
12f10 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
12f20 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
12f30 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
12f40 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
12f50 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
12f60 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
12f70 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69  gInfoColumn(sqli
12f80 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
12f90 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
12fa0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
12fb0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
12fc0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
12fd0 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e 66 6f  db,.       pInfo
12fe0 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 73  ->aCol,.       s
12ff0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
13000 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 33 2c  l[0]),.       3,
13010 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e  .       &pInfo->
13020 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  nColumn,.       
13030 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 41  &pInfo->nColumnA
13040 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  lloc,.       &i.
13050 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
13060 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
13070 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13080 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
13090 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
130a0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
130b0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
130c0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
130d0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
130e0 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
130f0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
13100 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
13110 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
13120 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
13130 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
13140 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
13150 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
13160 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
13170 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
13180 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
13190 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
131a0 20 20 20 20 20 20 20 33 2c 0a 20 20 20 20 20 20         3,.      
131b0 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a   &pInfo->nFunc,.
131c0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
131d0 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  FuncAlloc,.     
131e0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
131f0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
13200 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46  ** This is an xF
13210 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
13220 54 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69  Tree() used to i
13230 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c  mplement .** sql
13240 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
13250 67 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65  ggregates().  Se
13260 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
13270 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a  lyzeAggregates.*
13280 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
13290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
132a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
132b0 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67   analyzes the ag
132c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
132d0 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74   at pExpr..*/.st
132e0 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
132f0 41 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a  Aggregate(void *
13300 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
13310 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
13320 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
13330 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  = (NameContext *
13340 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a  )pArg;.  Parse *
13350 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
13360 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20  arse;.  SrcList 
13370 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
13380 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67  >pSrcList;.  Agg
13390 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
133a0 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a   pNC->pAggInfo;.
133b0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
133c0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
133d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
133e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
133f0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  MN: {.      /* C
13400 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
13410 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
13420 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
13430 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
13440 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
13450 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
13460 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
13470 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
13480 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
13490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
134a0 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
134b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
134c0 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
134d0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
134e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
134f0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
13500 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
13510 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
13520 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
13530 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
13540 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
13550 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
13560 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
13570 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13580 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
13590 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
135a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
135b0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
135c0 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
135d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
135e0 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
135f0 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
13600 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
13610 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
13620 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
13630 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
13640 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
13650 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13660 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
13670 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
13680 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
13690 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
136a0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
136b0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
136c0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
136d0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
136e0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
136f0 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
13700 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
13710 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
13720 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
13740 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
13750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13760 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
13770 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
13780 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
13790 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
137a0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
137b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
137c0 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
137d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
137e0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
137f0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
13800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13810 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
13820 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
13830 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
13840 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
13850 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
13860 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
13870 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
13880 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
13890 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70    pCol->iMem = p
138a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
138c0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
138d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
138e0 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
138f0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
13900 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
13910 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
13920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13930 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
13940 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
13950 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
13960 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13990 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
139a0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
139b0 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
139c0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
139d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
139e0 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
139f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13a00 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
13a10 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
13a40 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
13a50 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
13a60 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
13a70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
13a80 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
13a90 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13ab0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
13ac0 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13ae0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
13af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
13b30 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
13b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13b50 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
13b60 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
13b70 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
13b80 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
13b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
13bb0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
13bc0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
13bd0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
13be0 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
13bf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
13c00 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
13c10 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
13c20 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
13c30 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
13c40 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
13c50 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
13c60 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
13c70 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
13c80 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
13c90 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
13ca0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
13cb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13cc0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
13cd0 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
13ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
13cf0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
13d00 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
13d10 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
13d20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = k;.           
13d30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13d40 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
13d50 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
13d60 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
13d70 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
13d80 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
13d90 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
13da0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13db0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
13dc0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
13dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d       /* The pNC-
13de0 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20  >nDepth==0 test 
13df0 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65  causes aggregate
13e00 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75   functions in su
13e10 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a  bqueries.      *
13e20 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20  * to be ignored 
13e30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43  */.      if( pNC
13e40 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20  ->nDepth==0 ){. 
13e50 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
13e60 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
13e70 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
13e80 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
13e90 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
13ea0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
13eb0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
13ec0 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
13ed0 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
13ee0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
13ef0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
13f00 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
13f10 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
13f20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
13f30 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
13f40 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
13f50 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13f60 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
13f70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a  Expr, pExpr) ){.
13f80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13f90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
13fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13fb0 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f   if( i>=pAggInfo
13fc0 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  ->nFunc ){.     
13fd0 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73       /* pExpr is
13fe0 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65   original.  Make
13ff0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
14000 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
14010 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ].          */. 
14020 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20           u8 enc 
14030 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
14040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d  );.          i =
14050 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
14060 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
14070 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
14080 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20   if( i>=0 ){.   
14090 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d           pItem =
140a0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   &pAggInfo->aFun
140b0 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  c[i];.          
140c0 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
140d0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
140e0 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20      pItem->iMem 
140f0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
14100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
14110 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
14120 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
14130 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
14160 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
14170 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20  ken.n,.         
14180 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
14190 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
141a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
141b0 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
141c0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
141d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
141e0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
141f0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
14200 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
14210 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
14220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14230 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
14240 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
14250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
14260 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
14280 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
14290 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
142a0 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
142b0 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
142c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
142d0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
142e0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
142f0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
14300 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
14310 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
14320 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
14330 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
14340 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69  subqueries looki
14350 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e  ng for TK_COLUMN
14360 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64   nodes that need
14370 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e  .  ** to be chan
14380 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  ged to TK_AGG_CO
14390 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65  LUMN.  But incre
143a0 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74  ment nDepth so t
143b0 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f  hat.  ** TK_AGG_
143c0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
143d0 6e 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c  n subqueries wil
143e0 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  l be unchanged..
143f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
14400 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14410 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a   pNC->nDepth++;.
14420 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78      walkSelectEx
14430 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  pr(pExpr->pSelec
14440 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  t, analyzeAggreg
14450 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70  ate, pNC);.    p
14460 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20  NC->nDepth--;.  
14470 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
14480 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
14490 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
144a0 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
144b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
144c0 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
144d0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
144e0 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
144f0 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
14500 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
14510 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
14520 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
14530 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
14540 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
14550 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14560 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
14570 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
14580 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
14590 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
145a0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  zed by sqlite3Ex
145b0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
145c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72  ..**.** If error
145d0 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76  s are seen, leav
145e0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
145f0 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e  ge in zErrMsg an
14600 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  d return.** the 
14610 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
14620 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14630 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14640 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
14650 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
14660 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  xpr){.  int nErr
14670 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
14680 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72  nErr;.  walkExpr
14690 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c  Tree(pExpr, anal
146a0 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e  yzeAggregate, pN
146b0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43  C);.  return pNC
146c0 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d  ->pParse->nErr -
146d0 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
146e0 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
146f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
14700 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
14710 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
14720 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
14730 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
14740 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
14750 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14760 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
14770 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
14780 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73   short..*/.int s
14790 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
147a0 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e  eAggList(NameCon
147b0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c  text *pNC, ExprL
147c0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
147d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
147e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
147f0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  t i;.  int nErr 
14800 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
14810 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
14820 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
14830 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c   nErr==0 && i<pL
14840 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
14850 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14860 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33   nErr += sqlite3
14870 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
14880 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d  gates(pNC, pItem
14890 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ->pExpr);.    }.
148a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
148b0 72 3b 0a 7d 0a                                   r;.}.